在执行到某个条件的时候,需要让他异常退出,终止脚本运行,可是发现exit 1 并不能成功。
原因:因为只是退出了子进程。
何时进入子进程:我当时是管道,即 | 符号。也有别的情形。
排查方法:打印当前进程号 echo $bashpid
解决方法:在子进程结束的地方,再捕捉返回值,然后退出。
就比如我是进入管道后,开始进入子进程的,然后while循环去取每一行判断。那么就在while循环结束的地方,加一次捕捉
1)测试数据 data.txt
cat ./data.txt
1
2
3
2)测试脚本test.sh。测试方法:当读到行的内容为2的时候让程序退出
从cat ./data.txt | while read line到 done这行是子进程
echo "================最开始============"
echo "$BASHPID"
echo "===================================="
echo "${line}"
cat ./data.txt | while read line
do
echo "================进入管道后============"
echo "$BASHPID"
echo "===================================="
echo "${line}"
if [ ${line} -eq 2 ] ;then
exit 1
echo "未退出"
fi
echo "返回值"
echo "$?"
echo "返回值"
if [ $? -eq 1 ] ;then
echo "导入失败退出1!"
exit 1
fi
done
#===这里不要加语句,否则返回值可能会在这里被改变===
if [ $? -eq 1 ] ;then
echo "导入失败退出2!"
exit 1
fi
echo "================出循环后============"
echo "$BASHPID"
echo "===================================="
echo "$?"
if [ $? -eq 1 ] ;then
echo "导入失败退出3!"
exit 1
fi
if [[ $? -eq 1 ]] ;then
echo "导入失败退出4!"
exit 1
fi
3)测试结果
可见父进程号是8487,子进程号是8489。
程序在读到行值为2的时候退出了子进程,子进程里的其他程序没有再执行了。捕捉子进程的退出码后走了“导入失败退出2!” 程序结束了。后面的也没有执行。是想要的效果。
(我这里是调度任务需要让他走错误退出报警,所以返回的是1,如果你想不报警正常退出的话,返回值给0)
sh test.sh
================最开始============
8487
====================================
================进入管道后============
8489
====================================
1
0
================进入管道后============
8489
====================================
2
导入失败退出2!
踩过的坑:
一开始以为是循环的问题,专门写了个双重循环,测试了下发现不是。
以为是if的问题,发现也不是。