直到循环-条件为真时为什么它仍然可以工作

时间:2018-11-06 17:58:36

标签: linux bash loops break until-loop

Linux :Red Hat Enterprise Linux Server 6.5版(圣地亚哥)

BASH :GNU bash,版本4.1.2(1)-发行版(x86_64-redhat-linux-gnu)

我刚刚配置的其中一台VM仍在等待DNS更新其节点条目,而该节点上有一个已安装在/project_support文件夹中的NAS。 /project_support文件夹大约需要5到10分钟的时间,是的,我知道

由于我的自动化不因该问题而中断,并且我不想添加常量sleep NNN,因此我使用了until循环,以便直到挂载安装和/project_support文件夹是可用的,我想睡5秒钟并检查文件夹是否存在,然后再在自动化脚本/逻辑中继续进行操作。

为什么到给定文件夹的until命令成功又是退出状态cd时,第一个0循环为什么继续进行而没有退出条件检查?直到第二个都按预期工作。

对于第二个直到循环,即使我创建了文件夹(从另一个终端,直到循环运行),它也不会中断直到循环。

[root@nukaserver01 ~]# cd /project_support; echo $?
0
[root@nukaserver01 project_support]# pwd
/project_support

[root@nukaserver01 project_support]# until [ `cd /project_support` ]; do echo '-- sleep 5'; sleep 5; done
-- sleep 5
-- sleep 5
-- sleep 5
^C

[root@nukaserver01 project_support]# until [ `cd /project_support-I-DONT-EXIST-AT-ALL` ]; do echo '-- sleep 5'; sleep 5; done
-bash: cd: /project_support-I-DONT-EXIST-AT-ALL: No such file or directory
-- sleep 5
-bash: cd: /project_support-I-DONT-EXIST-AT-ALL: No such file or directory
-- sleep 5
^C
[root@nukaserver01 project_support]#

为什么当我这样做时这个问题会得到解决??

until [ `cd /project_support && pwd` ]; do ...; ...; done

2 个答案:

答案 0 :(得分:4)

until [ `cd /project_support` ]

反引号捕获cd的输出,无论指定的目录是否存在,它都是一个空字符串(错误消息会打印到stderr且不会捕获)。然后,方括号测试该字符串是否为空,始终为空。

不必要的方括号是常见的shell脚本弊病。摆脱它们和反引号。

until cd /project_support; do
    ...
done

请注意,由于cd不再在子Shell中执行,因此成功执行后实际上会生效。为防止这种情况,您可以添加一个显式的子外壳:

until (cd /project_support); do
    ...
done

或者,如果您只是等到目录存在,请直接检查:

until [[ -d /project_support ]]; do
    ...
done

答案 1 :(得分:2)

您要返回并测试一个空字符串,该字符串的总值为false。

until [ "" ] ; do sleep 1; date; done
Tue, Nov 06, 2018 12:03:17 PM
Tue, Nov 06, 2018 12:03:18 PM
Tue, Nov 06, 2018 12:03:19 PM
. . . 

通过添加pwd,它会在cd成功时返回目录名称/路径,作为字符串表示为true。

尝试-

until [[ -d /project_support ]] # ...

将测试目录是否存在。