shell脚本运行时,我是根,但我得到一个权限被拒绝时从一个Makefile中调用(仍然作为根)

我需要运行一个调用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脚本只包含lsecho 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的同一个用户…