以三种不同方式打开的同一个脚本会产生三种不同的结果。为什么?

Rap*_*ael 7 permissions command-line bash scripts

我有一个示例脚本(归功于kos):

#!/bin/bash
cat <(cat /etc/lsb-release)
Run Code Online (Sandbox Code Playgroud)

我将此脚本另存为我的主目录中的somename.sh

现在,我尝试以三种不同的方式打开这个文件:

sh somename.sh

bash somename.sh

./somename.sh
Run Code Online (Sandbox Code Playgroud)

所以,我有两个问题:

  1. 尽管上述命令运行相同的脚本,但为什么它们的输出不同?

    • sh产生语法错误

    • bash输出想要的结果

    • ./给出 Permission Denied 错误

  2. 为什么只有在使用./运行脚本时才需要赋予脚本可执行权限,而在其他情况下则不需要?

提前致谢!

编辑:第一部分可能类似于重复链接的部分,但是,我也有第二个问题。

kos*_*kos 8

正如我们在聊天中讨论的那样:

  1. sh script产生错误,因为直接调用解释器(在这种情况下sh)忽略了shebang,并且脚本运行在shsh不支持进程替换 ( <([...])),这是 Bash 主义,因此脚本会在出错时退出。

    bash script 不会产生错误,因为尽管忽略了 shebang,脚本仍然在 Bash 中运行,它支持进程替换。

    ./script由于script不可执行而产生错误。

  2. 要与./您一起运行脚本,您必须在脚本上为您的用户设置执行位,这是操作系统的约束。

    所以问题实际上是:为什么不需要bash script为您的用户设置执行位script

    这是因为运行时,bash script该脚本由巴什读取和Bash具有为用户设置了执行位。

    这意味着拥有执行代码权限的 Bash 可以“绕过”操作系统对该脚本的约束,并且所有脚本需要的都是 Bash 可读的。


Ser*_*nyy 5

  • sh是符号链接dash的外壳及因为没有产生一个语法错误<( . . .)sh语法。这只是在bash(和zshksh,如果我没记错的话)。

  • bash 输出所需的结果,因为它使用正确的 bash 语法,没有错

  • ./ 给出了 Permission Denied 错误,因为您基本上是说“嘿,shell,查看该文件的权限并查看#!/bin/bash当前目录中的第一行(带有 的行),并找出如何为我运行此脚本”。(旁注:如果您将脚本放在包含在$PATH变量中的位置,那么您只需运行即可myScriptName.sh,但想法是相同的,我们需要检查 exec 权限以及要使用的解释器)

在您运行bashdash告诉他们从文件中读取命令之前。bash并且dash这次是可执行的,而不是脚本。脚本现在是命令的来源,一个参数。始终为所有用户设置读取权限,因此 shell 将读取它。