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)
所以,我有两个问题:
尽管上述命令运行相同的脚本,但为什么它们的输出不同?
sh产生语法错误
bash输出想要的结果
./给出 Permission Denied 错误
为什么只有在使用./运行脚本时才需要赋予脚本可执行权限,而在其他情况下则不需要?
提前致谢!
编辑:第一部分可能类似于重复链接的部分,但是,我也有第二个问题。
正如我们在聊天中讨论的那样:
sh script产生错误,因为直接调用解释器(在这种情况下sh)忽略了shebang,并且脚本运行在sh;sh不支持进程替换 ( <([...])),这是 Bash 主义,因此脚本会在出错时退出。
bash script 不会产生错误,因为尽管忽略了 shebang,脚本仍然在 Bash 中运行,它支持进程替换。
./script由于script不可执行而产生错误。
要与./您一起运行脚本,您必须在脚本上为您的用户设置执行位,这是操作系统的约束。
所以问题实际上是:为什么不需要bash script为您的用户设置执行位script?
这是因为运行时,bash script该脚本由巴什读取和Bash具有为用户设置了执行位。
这意味着拥有执行代码权限的 Bash 可以“绕过”操作系统对该脚本的约束,并且所有脚本需要的都是 Bash 可读的。
sh是符号链接dash的外壳及因为没有产生一个语法错误<( . . .)的sh语法。这只是在bash(和zsh和ksh,如果我没记错的话)。
bash 输出所需的结果,因为它使用正确的 bash 语法,没有错
./ 给出了 Permission Denied 错误,因为您基本上是说“嘿,shell,查看该文件的权限并查看#!/bin/bash我当前目录中的第一行(带有 的行),并找出如何为我运行此脚本”。(旁注:如果您将脚本放在包含在$PATH变量中的位置,那么您只需运行即可myScriptName.sh,但想法是相同的,我们需要检查 exec 权限以及要使用的解释器)
在您运行bash并dash告诉他们从文件中读取命令之前。bash并且dash这次是可执行的,而不是脚本。脚本现在是命令的来源,一个参数。始终为所有用户设置读取权限,因此 shell 将读取它。