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

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

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

root@root:~# echo $-
himBHs
root@root:~# ./abc.sh 
hB
root@root:~#

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

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

root@root:~# /bin/bash
root@root:~# echo $-
himBHs

当我尝试从内部执行相同的过程时外壳文件,我得到的输出是“HB”。

root@root:~# ./abc.sh 
hB

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

我究竟缺少什么?

答案1

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

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

您可以看到完整的选项列表set,这些选项将在输出中看到$--内置集合

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

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

答案2

默认情况下启用(或禁用)多个设置取决于 Bash 是否以 POSIX 模式或其他方式交互运行。例如,从输出help set

  -H  Enable ! style history substitution.  This flag is on
      by default when the shell is interactive.

或者:

  -p  Turned on whenever the real and effective user ids do not match.

碰巧的是,对于交互式、非 POSIX 模式的 Bash,启用的选项是himBHs-i用于交互模式,-s用于从标准输入读取命令,其他选项在 中列出help set)。

相关内容