左关联模式被广泛应用于各种语言的逻辑运算符优化中. 对于逻辑与运算符 && , 以 eq1 && eq2 为例, 只有当两边都为 True 才会返回 True , 因此当 eq1 为 False 时, eq2 不会执行; 对于逻辑或运算符 || , 以 eq1 || eq2 为例, 只要两边有一个 True 就会返回 True , 因此当 eq1 为 True 时, eq2 不会执行。
脚本: 使用 . 或 source 运行脚本文件等同于在当前 bash 中执行代码块, 脚本中最后执行的命令的退出状态就是脚本的退出状态. 使用 ./脚本名 或 bash 脚本名 的方式执行脚本文件等同于执行外部命令, 脚本的退出状态就是外部命令 bash 的退出状态. 如果脚本中最后执行的命令是 exit , 那么使用 . 或 source 执行该脚本文件在执行结束后会退出当前 bash .
后台作业与协作进程: 使用不带选项的 wait 命令可以获得最后一个执行完毕的后台作业的退出状态, 如果使用 wait -n <jobsec> 可以获得指定后台作业的退出状态, 如果作业不存在则退出状态为 127 . 使用 coproc 在 sub shell 中执行的命令的退出状态和后台作业一样可以被 wait 获取, coproc 自身的退出状态始终为 0 .
> { sleep 10; aad; } &
[1] 558
> wait -n 1
[1]+ Exit 127 { sleep 10; aad; }
> coproc { sleep 10; aad; }
[1] 558
> echo $?
0 # 这是 coproc 的执行结果
> jobs
[1]+ Exit 127 coproc COPROC { sleep 10; aad; }
管道命令: 默认情况下, 管道的退出状态取决于管道中最后一条命令的退出状态. 如果设置了 set -o pipefail , 那么只有在管道中的全部命令的退出状态为 0 时, 整个管道的退出状态才为 0 , 否则就是最后一个非零的退出状态. 在管道前添加 ! 符号可以对整个管道的退出状态取反. bash 中的特殊变量 $PIPESTATUS 以数组的形式存储最近执行的前台管道的退出状态, 要注意的是单个命令也会被记录, 也就是说 ${PIPESTATUS[0]} 和 $? 是等价的.
# 管道的退出状态是最后一条命令的退出状态
> ps | xxp 2>/dev/null | cat; echo $?
0
> set -o pipefail
> ps | xxp 2>/dev/null | cat; echo $?
127 # 设置了 pipefail 因此得到最后一个非零退出状态
# 管道中每个命令的退出状态被按顺序记录在数组中
> easd 2>/dev/null | ls /nou 2>/dev/null | more 2>/dev/null
> echo ${PIPESTATUS[@]}
127 2 0
# 不带管道符号的单个命令也会被记录
> ping asbasdasd 2>/dev/null; echo ${PIPESTATUS[0]}
2
> ping asbasdasd 2>/dev/null; echo $?
2
参考资料
Exit status range
Bash man page
以上就是详解bash中的退出状态机制的详细内容,更多关于bash 退出状态 的资料请关注易采站长站其它相关文章!










