当我们使用命令打印控制台设置时echo $-
,我们himBHs
默认输出。但是,当我们在任何脚本文件中运行相同的命令时,我们只会输出hB
.
root@root:~# echo $-
himBHs
root@root:~# ./abc.sh
hB
root@root:~#
我想知道的是,即使我们从/bin/bash
环境中运行脚本,为什么不应用相同的默认设置?
例如,当我使用/bin/bash
控制台上的命令启动一个新的子 shell 进程并列出设置时,我会得到 output himBHs
。
root@root:~# /bin/bash
root@root:~# echo $-
himBHs
当我尝试从shell 文件中执行相同的过程时,我得到的输出是“ hB ”。
root@root:~# ./abc.sh
hB
我已经尝试了使用 shebang 和没有 shebang 的相同过程,但是我的脚本文件是bash script_file
或者./script_file
如果我运行,它会给出相同的结果(hB
)。
我到底错过了什么?
因为当您运行脚本时,父外壳(您从中运行命令的外壳)启动一个非交互式外壳来运行您的脚本,该脚本禁用了交互式标志
i
并且只打开了两个选项-h
在查找执行命令时定位并记住(散列)命令。-B
允许外壳执行大括号扩展您可以在- The Set Builtin
set
的输出中看到完整的选项列表$-
交互式 shell 中可用的其他选项,
-i
以指示以交互模式运行 shell-m
允许作业控制-H
启用!
样式历史替换默认情况下启用(或禁用)几个设置,具体取决于 Bash 是否以交互方式、POSIX 模式或其他方式运行。例如,从输出
help set
:或者:
碰巧对于交互式的非 POSIX 模式 Bash,启用的选项是
himBHs
(-i
用于交互模式,-s
用于从标准输入读取命令,其他选项列在 中help set
)。