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
答案 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 ]] # ...
将测试目录是否存在。