关于 Linux shell 上的脚本执行权限

Posted

技术标签:

【中文标题】关于 Linux shell 上的脚本执行权限【英文标题】:About script execution permissions on Linux shell 【发布时间】:2021-11-16 05:28:11 【问题描述】:

事情是这样的:

我刚刚创建了一个脚本,比如说“helloworld.sh”。 脚本还没有执行权限:-rw-rw-r-- 话虽如此,如果我尝试使用以下命令执行该脚本:“./helloword.sh”,我将收到一条错误消息,正如预期的那样。 但是,如果我尝试执行与“.helloword”相同的脚本,它将毫无问题地执行。

所以,我的问题是,如何?为什么会这样?

【问题讨论】:

【参考方案1】:

这是因为在 Linux 上的“.” (dot) 单独是一个内置命令,可在当前会话中使用当前 shell 执行脚本。这与使用 source 命令(BSD 默认方法)调用脚本相同。这几乎与使用bash helloworld.sh 执行相同。

当你用./helloworld.sh/root/helloworld.sh 调用脚本时,shell 会尝试找出如何执行它,如果文件是二进制文件,它会简单地运行,如果是脚本,shell 会读取寻找解释器的第一行。为此,您需要执行权限。

为了简化:

一个是命令; 另一个是路径。

你甚至可以运行:

. --help

关于.bash

这就是我们使用 .source 从会话中的文件加载变量的原因,例如,当我们更改 ~/.bashrc 并重新加载它而无需再次登录。

您可以在执行时看到这种情况:

. /etc/os-release

此文件中定义的所有变量都将被加载并在您当前的 shell 会话中可用。

如果你执行,同样的情况不会发生:

bash /etc/os-release

因为您在调用的 bash 中打开了一个“新会话”,所以新的 bash 会执行并关闭,从而清理会话。

如果您将执行权限+x 授予脚本,则会发生相同的过程,因为当您使用./ 或类似名称调用脚本时,也会创建一个新会话。

【讨论】:

以上是关于关于 Linux shell 上的脚本执行权限的主要内容,如果未能解决你的问题,请参考以下文章

linuxshell 脚本执行的过程是怎样的?

Linux shell 脚本

如何在shell脚本中执行cd命令

Linux中执行shell脚本的4种方法

求问 BAT脚本如何自动执行 adb shell 以后的命令

执行shell脚本的方式都有哪些