Google 的 Shell 样式指南中建议使用 `set` 来设置 shell 选项是什么意思?

typ*_*ypo 12 bash shell-script

来自 Google 的 Shell 风格指南

Bash 是唯一允许用于可执行文件的 shell 脚本语言。

可执行文件必须#!/bin/bash以最少数量的标志开始。使用set来设置shell选项,以便您的通话脚本bash script_name不会破坏其功能。

具体来说,关于使用set以避免破坏功能的部分。以这种特殊方式调用它与它有什么关系?

ilk*_*chu 29

“和最小数量的标志”是指在 hashbang 行中设置的标志。当脚本作为 启动时,它们会被读取./somescript,内核读取 hashbang 行,从那里找到的路径和选项构建一个新的参数列表。但是,如果脚本以 启动,则不会发生这种情况bash somescript,因为要求内核运行bash,而不是脚本本身。在最终阅读脚本时,shell 本身将该行视为要忽略的注释。

例如,尝试以下脚本(在 中./hello):

#!/bin/bash -x
echo hello
Run Code Online (Sandbox Code Playgroud)

并以两种方式运行它:

$ ./hello
+ echo hello
hello
$ bash hello
hello
Run Code Online (Sandbox Code Playgroud)

来自 的额外跟踪输出-x仅在第一种情况下显示,第二次调用时忽略该标志。

使用set命令显式启用标志将使其以任何方式工作:

#!/bin/bash
set -x
echo hello
Run Code Online (Sandbox Code Playgroud)

(但请注意,如果你曾经尝试用这个perl,它没有解释hashbang线本身也。)

  • @ctrl-alt-delor,哈,嗯,是的。但是源代码文件通常有一个扩展名(无论是`.c` 或`.pl` 或`.py`),所以也许这就是习惯的来源。还有一些编辑查看扩展来猜测语言...... (4认同)
  • 来自同一个指南(和一些旧的 Unix 指南)“可执行文件应该没有扩展名”。使用文件扩展名来标记语言,打破了封装。 (3认同)
  • @G-ManSays'ReinstateMonica',是的,我应该写“我想不出来”。有`set -p`,它会降低额外的权限,但可能不会撤消导入功能(`bash -p` 阻止导入)。`--login` 或 `-l` 可能没有等效项,至少它在手册页中与 `set` 选项分开列出。并且它也会影响启动文件,例如`--rcfile`,启动后没有办法做到这一点。有 `set -o posix`,它可能与 `--posix` 的作用相同,除非这里的启动文件也有一些不同。 (2认同)