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 脚本仅包含 ls
或 echo 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
收工。
我需要 运行 一个 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 脚本仅包含 ls
或 echo 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
收工。