shell 脚本 运行 当我是 root 但当从 Makefile 调用它时我得到一个拒绝的权限(仍然是 root)

shell script run when I am root but I get a permission denied when it is invoked from a Makefile (still as root)

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

我可以 运行 shell 脚本直接作为 root 但是当 运行 对 makefile 进行 make 时(仍然作为 root)make 被拒绝许可 运行相同的 shell 脚本?

Makefile 中有问题的一行是:

PLATFORM=$(shell $(ROOT)/systype.sh)

我可以进入并硬编码系统上每个 Makefile 脚本的每个 PLATFORM 变量的值,但这将是毫无意义的修复,我想了解为什么会出现权限被拒绝的错误:

make[1]: execvp: ../systype.sh: Permission denied

PS:即使 shell 脚本仅包含 lsecho linux,shell 脚本的内容也不是问题shell 脚本 运行 的 Make 实用程序被拒绝。

PS:从某种意义上说,我不是制作专家,所以如果解释与制作有关,请尽可能具体。

为文件组而不是文件用户添加执行权限解决了这个问题。

PS:不知道为什么? Make 实用程序 运行 shell 脚本似乎与启动 Make...

的用户不同

在您上面的评论中,您说当您 "run it manually" 使用 . scriptname.sh 时,对吗?您使用 . 后跟 scriptname.sh?

没有运行脚本,来源脚本。您关于 scriptname.sh 将在有和没有 x 许可的情况下执行的说法是错误的,因为它是 shell 脚本 。如果您有读取权限,您可以 source 脚本。但是你不能执行脚本,除非你有执行权限。

"Sourcing" 表示未启动新的 shell:相反,您当前的 shell(您键入该命令的位置)读取 contents 和 运行 就像您在当前 shell 中手动输入它们一样。最后,在该脚本中执行的所有副作用(目录更改、变量赋值等)在您当前的脚本中仍然可用。

"Executing" 表示脚本被当作程序处理,但程序是一个新的 shell 启动,然后读取脚本的内容并执行它。一旦脚本结束,shell 退出并且所有副作用都将丢失。

make 中的 $(shell ...) 函数不会为您的脚本提供源代码(除非您在那里也使用了 .,但您没有)。它会尝试 运行 你的脚本。您显示的错误意味着 systype.sh 没有设置执行位,或者它有一个无效的 #!线。我想不出其他解释了。

如果获取文件确实可以满足您的需求,那么为什么不直接使用您在 $(shell ...) 中用于个人用途的相同方法:

PLATFORM=$(shell . $(ROOT)/systype.sh)

如果更改用户权限无效,您确定拥有该脚本的用户与您用来调用 make 的用户相同吗?你说你是"running as root";脚本是 root 拥有的吗?还是它归您所有并且您是 运行宁 sudo make 或类似的人?

我不知道你为什么不直接使用:

chmod +x systype.sh

收工。