当我们用命令打印控制台设置时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
)。