阿毛
It's me !
想你所想

关于shell中在()内exit使用问题!

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 /

humh

文章作者

站长本人,一个憨批!

发表回复

textsms
account_circle
email

想你所想

关于shell中在()内exit使用问题!
woc,真才知道exit在()括号内使用,并不能退出整个shell脚本! 昨天,在给公司项目写一个脚本的时候,发现了一个问题,一直用错了姿势。。 如下有这么一个大致脚本内容: #!/usr…
扫描二维码继续阅读
2021-08-07