shell脚本在我是root时运行,但是当从Makefile调用它时仍然被拒绝(仍然是root用户)

时间:2015-02-04 22:06:26

标签: linux shell permissions makefile denied

我需要运行一个 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脚本只包含lsecho linux拒绝Make实用程序运行shell脚本的权限。

PS:我不是一个制作专家,所以如果解释与Make有关请尽可能具体。

2 个答案:

答案 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 ...

的同一用户