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

Linux shell脚本在我是root用户时运行,但在从Makefile(仍然是root用户)调用它时,权限被拒绝,linux,shell,makefile,Linux,Shell,Makefile,我需要运行一个调用shell脚本的Make脚本 我可以直接以root身份运行shell脚本,但是在makefile上运行make时(仍然以root身份),make被拒绝运行相同的shell脚本吗 Makefile中有问题的行是: PLATFORM=$(shell $(ROOT)/systype.sh) 我可以进去硬编码系统上每个Makefile scrip的每个平台变量的值,但这是毫无意义的修复,我想了解为什么会出现权限拒绝错误: make[1]: execvp: ../systype.sh:

我需要运行一个调用shell脚本的Make脚本

我可以直接以root身份运行shell脚本,但是在makefile上运行make时(仍然以root身份),make被拒绝运行相同的shell脚本吗

Makefile中有问题的行是:

PLATFORM=$(shell $(ROOT)/systype.sh)
我可以进去硬编码系统上每个Makefile scrip的每个平台变量的值,但这是毫无意义的修复,我想了解为什么会出现权限拒绝错误:

make[1]: execvp: ../systype.sh: Permission denied
PS:shell脚本的内容不是问题,即使shell脚本仅包含
ls
echo-linux
,Make实用程序运行shell脚本的权限被拒绝


PS:我不是一个制造专家,因此如果解释与制造相关,请尽可能具体

将执行权限添加到文件组,而不是由文件用户解决问题


我想知道为什么?Make实用程序运行shell脚本的用户似乎与启动Make的用户不同。

在您上面的评论中,您在“手动运行”时使用的是
。scriptname.sh
,对吗?您使用
后跟
scriptname.sh


不运行脚本的源代码。您关于scriptname.sh将在有x权限和无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

到此为止。

如何手动运行它<代码>/path/to/systype.sh<代码>bash/path/to/systype.sh?如果是后者,则问题可能是可执行权限。脚本是否设置了执行标志(
chmod 755 systype.sh
)?它有shebang行吗?当我手动运行它时,我使用。scriptname.shscriptname.sh将在没有x权限的情况下使用执行,因为它是一个shell脚本(我尝试了两种方法只是为了消除这种可能性),我的默认shell是bash,正如您从/etc/passwd root:x:0:0:root:/root:/bin/bash lvignals:x:1000:1000:lvignals、、、:/home/lvignals:/bin/bash中可以看到的那样