关于在 `set` 上列出 bash 选项

tes*_*ter 4 bash set

当我们用命令打印控制台设置时echo $-,我们himBHs默认输出。但是,当我们在任何脚本文件中运行相同的命令时,我们仅输出hB.

root@root:~# echo $-
himBHs
root@root:~# ./abc.sh 
hB
root@root:~#
Run Code Online (Sandbox Code Playgroud)

我想知道的是,即使我们从/bin/bash环境中运行脚本,为什么不应用相同的默认设置?

例如,当我使用/bin/bash 控制台上的命令启动新的子 shell 进程并列出设置时,我会得到输出himBHs

root@root:~# /bin/bash
root@root:~# echo $-
himBHs
Run Code Online (Sandbox Code Playgroud)

当我尝试从shell 文件中执行相同的过程时,我得到的输出是“ hB ”。

root@root:~# ./abc.sh 
hB
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用 shebang 和不使用 shebang 的相同过程,但是我的脚本文件是或者bash script_file如果./script_file我运行,它会给出相同的结果(hB)。

我究竟缺少什么?

Ini*_*ian 5

因为当您运行脚本时,父 shell(您从中运行命令的 shell)会启动一个非交互式 shell 来运行您的脚本,该脚本禁用了交互式标志i,并且仅打开两个选项

  • -h在查找执行命令时定位并记住(散列)命令。
  • -B允许 shell 执行大括号扩展

您可以看到完整的选项列表,这些选项将在- The Setbuiltinset的输出中看到$-

交互式 shell 中可用的其他选项,-i用于指示以交互模式运行 shell

  • -m允许作业控制
  • -H启用!样式历史替换

  • @testter:是的,您可以查看以下帖子[shebang中的多个参数](https://unix.stackexchange.com/q/399690/112235),[Shebang line with `#!/ usr/bin/env 命令 --argument` 在 Linux 上失败](https://unix.stackexchange.com/q/63979/112235) 和 [执行脚本时如何将参数传递给 shebang 解释器?](https: //unix.stackexchange.com/q/182227/112235) (2认同)