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

use*_*217 1 linux shell makefile

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

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

Makefile 中有问题的行是:

PLATFORM=$(shell $(ROOT)/systype.sh)
Run Code Online (Sandbox Code Playgroud)

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

make[1]: execvp: ../systype.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

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

Mad*_*ist 5

在上面的评论中,您说当您“手动运行”时使用. scriptname.sh,这是正确的吗?您使用.后跟scriptname.sh?

这不会运行脚本,而是会获取脚本。您关于scriptname.sh 由于是 shell 脚本而在有或没有 x 权限的情况下都会执行的说法是错误的。如果您具有读取权限,则可以获取该脚本。但除非您具有执行权限,否则无法执行该脚本。

“Sourcing”意味着不会启动新的 shell:相反,您当前的 shell(您在其中键入该命令)会读取脚本的内容并运行它们,就像您在当前 shell 中手动输入它们一样。最后,在该脚本中执行的所有副作用(目录更改、变量分配等)在当前脚本中仍然可用。

“执行”意味着脚本被视为一个程序,但该程序是一个启动的新shell,然后它读取脚本的内容并执行它。一旦脚本结束,shell 就会退出,所有副作用都会丢失。

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

如果获取文件确实符合您的要求,那么为什么不使用$(shell ...)与您个人使用相同的方法:

PLATFORM=$(shell . $(ROOT)/systype.sh)
Run Code Online (Sandbox Code Playgroud)

如果更改用户权限不起作用,您确定拥有该脚本的用户与您用来调用 make 的用户是同一用户吗?你说你“以 root 身份运行”;该脚本是否属于root?或者它是由您拥有并且您正在运行sudo make或类似的?

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

chmod +x systype.sh
Run Code Online (Sandbox Code Playgroud)

到此为止。