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

标签 linux shell makefile

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

我可以直接以 root 身份运行 shell 脚本,但是当在 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 脚本的内容也不是问题 Make 实用程序的运行权限被拒绝shell 脚本。

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

最佳答案

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

这不会运行 脚本,获取 脚本。您关于 scriptname.sh 将在有和没有 x 权限的情况下执行的声明,因为它是一个 shell 脚本 是错误的。如果您具有读取权限,则可以source 脚本。但是除非您具有执行权限,否则您不能执行脚本。

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

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

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

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

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

如果更改用户权限无效,您确定拥有该脚本的用户与您用来调用 make 的用户相同吗?你说你“以根用户身份运行”;脚本是 root 拥有的吗?或者它归您所有并且您正在运行 sudo make 或类似的程序?

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

chmod +x systype.sh

收工。

关于linux - 当我是 root 时运行 shell 脚本,但是当从 Makefile 调用它时我得到一个被拒绝的权限(仍然是 root),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332397/

相关文章:

shell脚本: Use a pipe as an input for tar

shell - Vagrant 配置 shell 与 puppet 与 Chef

linux - 如何编写 shell 脚本以从 sar 报告中查找 ram 利用率的最小最大值和平均值

c++ - 生成文件 "nothing to be done"

linux - 页目录表的低22位(0~21bit)有什么作用?

c++ - 如何获取 C/C++ 中 Linux 系统调用的输出?

c# - 无法使用 32feet.Net C# 库通过蓝牙将文件从 Windows 传输到 Linux

django - uWSGI 使用插件 Python36 运行 Python 2 -> 在 Venv 中找不到 Django

linux - 在 CMake Linux 中包含 OpenCV

c - 如何使用 libuv 编译最小程序?