我需要运行一个调用 shell 脚本的 Make 脚本。
我可以直接以 root 身份运行 shell 脚本,但是当在 makefile 上运行 make 时(仍然以 root 身份),make 被拒绝运行相同 shell 脚本的权限?
Makefile 中有问题的那一行是:
PLATFORM=$(shell $(ROOT)/systype.sh)
我可以进入并对系统上每个 Makefile 脚本的每个 PLATFORM 变量的值进行硬编码,但这将是毫无意义的修复,我想了解为什么会出现“权限被拒绝”错误:
make[1]: execvp: ../systype.sh: Permission denied
PS:即使 shell 脚本仅包含 ls
或 echo linux
,shell 脚本的内容也不是问题 Make 实用程序的运行权限被拒绝shell 脚本。
PS:我不是制作专家,所以如果解释与制作有关,请尽可能具体。
最佳答案
在您上面的评论中,您说当您“手动运行”时使用 。 scriptname.sh
,对吗?您使用 .
后跟 scriptname.sh
?
这不会运行 脚本,获取 脚本。您关于 scriptname.sh 将在有和没有 x 权限的情况下执行的声明,因为它是一个 shell 脚本 是错误的。如果您具有读取权限,则可以source 脚本。但是除非您具有执行权限,否则您不能执行脚本。
“Sourcing”意味着新的 shell 没有启动:相反,您当前的 shell(您在其中键入该命令)读取脚本的内容并运行它们,就像您键入它们一样在当前 shell 中手动输入。最后,在该脚本中执行的所有副作用(目录更改、变量分配等)在您当前的脚本中仍然可用。
“执行”意味着脚本被当作一个程序来对待,但程序是一个新启动的shell,然后读取脚本的内容并执行它。一旦脚本结束,shell 就会退出,所有副作用都会丢失。
make 中的 $(shell ...)
函数不会为您的脚本提供源代码(除非您在那里也使用了 .
,而您没有)。它将尝试运行您的脚本。您显示的错误意味着 systype.sh
没有设置执行位,或者它有一个无效的 #!线。我想不出其他解释。
如果获取文件确实可以满足您的需求,那么为什么不在 $(shell ...)
中使用与您个人使用相同的方法:
PLATFORM=$(shell . $(ROOT)/systype.sh)
如果更改用户权限无效,您确定拥有该脚本的用户与您用来调用 make 的用户相同吗?你说你“以根用户身份运行”;脚本是 root 拥有的吗?或者它归您所有并且您正在运行 sudo make
或类似的程序?
我不知道你为什么不直接使用:
chmod +x systype.sh
收工。
关于linux - 当我是 root 时运行 shell 脚本,但是当从 Makefile 调用它时我得到一个被拒绝的权限(仍然是 root),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332397/