bash脚本为何不继承-e选项?如何查询$-各标志含义?
问题解答
为什么子shell能继承-e选项但脚本不行?
bash在启动非交互式脚本时,会默认重置一系列选项,其中就包括-e(errexit,命令执行失败时立即退出)。这是脚本的默认行为,目的是避免父shell的选项设置意外干扰脚本的执行逻辑。
而子shell(比如通过bash -e启动的交互式子shell,或是用(command)语法创建的子shell)本质是当前shell的副本,会完整继承父shell的所有选项设置,所以-e会被保留。
如果想让脚本继承父shell的-e选项,有两种方式:
- 启动脚本时显式传递选项:
bash -e echo_set_options - 在脚本开头添加
set -e命令手动开启该选项
$-中各标志的含义
$-变量存储了当前bash会话的启用标志,常见标志的含义如下:
e:启用errexit选项,命令返回非0状态时立即退出i:当前是交互式shell(比如直接打开的终端会话)B:启用大括号扩展(比如echo {a,b}c会输出ac bc)h:启用hashall选项,bash会记住命令的路径,避免重复查找m:启用monitor选项,允许使用作业控制(比如bg、fg命令)H:启用histexpand选项,支持!开头的历史命令扩展(比如!!执行上一条命令)s:当前shell从标准输入读取命令(比如通过管道传递命令,或是执行bash < script.sh时会出现)f:禁用文件名扩展(globbing,比如echo *不会展开成当前目录文件)v:启用verbose选项,执行命令前先打印命令内容x:启用xtrace选项,执行命令前打印命令及参数(常用于调试)
内容的提问来源于stack exchange,提问作者Ray Gllisse
相关产品推荐
相关产品推荐

