我的Bash代码:
#!/bin/sh
set -ex
function func ()
{
sleep $1
echo $1
if [ $1 -eq 10 ]; then
exit 1
fi
}
func 10 &
pid_a=$!
func 5 &
pid_b=$!
func 3 &
pid_c=$!
wait $pid_b
if [ $? -eq 0 ];then echo "b.ksh SUCCESS"; else echo "b.ksh FAILED"; fi
wait $pid_c
if [ $? -eq 0 ];then echo "c.ksh SUCCESS"; else echo "c.ksh FAILED"; fi
wait $pid_a
if [ $? -eq 0 ];then
echo "a.ksh SUCCESS"; else echo "a.ksh FAILED"; fi
在启用set -ex
时运行:
sh-4.2$ ./ex.sh
+ pid_a=16341
+ func 10
+ pid_b=16342
+ sleep 10
+ func 5
+ pid_c=16343
+ sleep 5
+ wait 16341
+ func 3
+ sleep 3
+ echo 3
3
+ '[' 3 -eq 10 ']'
+ echo 5
5
+ '[' 5 -eq 10 ']'
+ echo 10
10
+ '[' 10 -eq 10 ']'
+ exit 1
此处父母也退出状态1退出的后台进程。 你能解释一下原因吗?
答案 0 :(得分:3)
你做不到
command
if [ $? -eq 0 ]; then ...
在set -e
- 使用脚本。由于命令的非零退出状态甚至到达if
之前脚本将结束。
wait
报告等待进程的退出状态为自己的退出状态(或者$?
检查无论如何都是毫无意义的)。试试这个:
if wait $pid_x; then
echo "x.ksh SUCCESS"
else
echo "x.ksh FAILED"
fi
答案 1 :(得分:1)
bash手册中提到set -e
:
-e
如果一个简单的命令(参见上面的SHELL GRAMMAR)以非零状态退出,则立即退出。该 如果失败的命令是紧跟在a之后的命令列表的一部分,则shell不会退出while
或until
个关键字,if
语句中的部分测试,&&
或||
列表的一部分,或者 命令的返回值通过!
反转。 ERR上的陷阱(如果已设置)在执行之前执行 shell退出。
它没有说'当后台进程以非零状态退出时,shell将不会终止' - 所以它在后台进程失败时终止。