我有一个简单的shell脚本,它试图找出一个特定的停靠容器是否正在运行。在shell脚本中,我有一条折页线;
RUNNING_CONTAINERS=$(docker ps -a | grep ${IMAGE_NAME})如果grep没有返回任何结果,shell脚本就会出现在那里。即使grep的结果为空,我如何编写脚本以确保脚本继续执行?
发布于 2015-11-13 13:36:16
这是因为代码中某个地方存在set -e,这会使脚本在命令返回非零状态时立即退出。在这种情况下,grep因为它没有找到任何匹配。
在 builtin中读取
-e 如果管道(参见管道)(可能由单个简单命令(参见简单命令)、列表(见列表)或复合命令(参见复合命令)组成)返回非零状态,则立即退出。如果失败的命令是命令列表的一部分,则shell不会退出,该命令是紧接“时间”或“直至”关键字的命令列表的一部分,是if语句中测试的一部分,也是在&或\列表中执行的任何命令的一部分,但在最后一个管道中的任何命令之后的命令除外,或者如果命令的返回状态与!倒置,则不退出。如果子shell以外的复合命令由于忽略-e时命令失败而返回非零状态,则shell不会退出。如果设置了错误,则在shell退出之前执行错误陷阱。
同时,来自man grep
退出状态 通常,如果选择一行,退出状态为0;如果没有选择行,则为1;如果发生错误,则为2。但是,如果使用-q或-静默或-静默并选择一行,则即使发生错误,退出状态也为0。
所以grep没有找到任何东西,而是返回一个非零的退出状态。然后,set -e捕获它,并看到它不是来自“异常”(if,while.(正如引用中提到的那样,它在管道中的最后一个命令之前都不是,所以它就退出了。
测试
让我们创建一个非常基本的脚本:
$ cat a.sh
#!/bin/bash
set -e
echo "hello"
grep "hello" a
echo "bye"并生成一个空的a文件:
$ touch a如果我们运行它,当grep不返回任何结果时,就会看到它退出:
$ ./a.sh
hello但是,如果我们删除set -e行,它会一直到文件的末尾:
$ ./a.sh
hello
bye还请参见,如果grep不是管道中的最后一个元素,则不会失败:
$ cat a.sh
#!/bin/bash
set -e
echo "hello"
grep "hello" a | echo "he"
echo "bye"
$ ./a.sh
hello
he
byehttps://stackoverflow.com/questions/33693751
复制相似问题