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