woc,真才知道exit在()括号内使用,并不能退出整个shell脚本!
昨天,在给公司项目写一个脚本的时候,发现了一个问题,一直用错了姿势。。
如下有这么一个大致脚本内容:
#!/usr/bin/env bash ls /test || (echo 'dir not exists' && exit 1) # 如果上一步成功了,进行下面正常的逻辑 ls /
我希望,如果ls /test
有问题,发现目录不存在,则输出提示信息,并直接退出脚本,不再执行之后的逻辑。我想着输出错误信息和退出脚本是一个逻辑,所以括号括起来。
执行上面脚本
root@LAPTOP-RPOAPQVQ:/tmp# ./test.sh ls: cannot access '/test': No such file or directory dir not exists bin boot dev etc home init lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var
但真正的执行效果,并没有退出脚本,而是执行了之后的逻辑ls /
。百思不得其解,于是度娘一下,才知道。原来exit在括号内使用,就只是退出括号而已,()
内的shell会作为整个shell脚本的子shell执行,而不在整个shell脚本进程中,所以exit只是退出了子shell,所以shell脚本继续执行。平常,我们没有在括号内些exit,而在函数体或条件语句中调用exit都是没问题,直接退出脚本进程的。因为他们都不会存在子shell中执行的问题。如下:
#!/usr/bin/env bash test_fun() { echo 'fun' && exit 1 } test_fun # 如果上一步成功了,进行下面正常的逻辑 ls /
执行结果
root@LAPTOP-RPOAPQVQ:/tmp# ./test.sh fun
所以针对上面括号内exit的问题,脚本逻辑不变的情况下,可以改为
#!/usr/bin/env bash ls /test || echo 'dir not exists' && exit 1 # 如果上一步成功了,进行下面正常的逻辑 ls /
即去掉()
。或者用{}
替代
#!/usr/bin/env bash ls /test || { echo 'dir not exists' && exit 1; } # 如果上一步成功了,进行下面正常的逻辑 ls /
发表评论