我需要运行一个调用shell脚本的Make脚本 。
我可以直接以root用户的身份运行shell脚本,但是在makefile上运行make时(仍然以root身份)make被拒绝运行同一个shell脚本的权限?
Makefile中的违规行是:
PLATFORM=$(shell $(ROOT)/systype.sh)
我可以在系统中硬编码每个Makefile脚本的每个PLATFORMvariables的值,但是这将是毫无意义的修复,我想了解为什么存在Permission Denied错误:
make[1]: execvp: ../systype.sh: Permission denied
PS:shell脚本的内容不是问题,即使shell脚本只包含ls
或echo linux
权限被拒绝,Make实用程序运行shell脚本。
PS:我不是一个平均的专家,所以如果解释与Make相关,请尽可能具体。
在上面的评论中,你说当你“手动运行”你使用. scriptname.sh
. 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身份运行”; 是root拥有的脚本? 还是由你拥有,你正在运行sudo make
或类似?
我不知道你为什么不使用:
chmod +x systype.sh
并称之为一天。
添加执行权限的文件组,而不是文件用户解决了问题。
PS:我想知道为什么? 看来Make实用程序运行的shell脚本不是与启动Make的同一个用户…