2

Linux:红帽企业 Linux 服务器 6.5 版(圣地亚哥)

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

我刚刚配置的 VM 之一仍在等待 DNS 更新它的节点条目,并且一个节点有一个安装在/project_support文件夹中的 NAS。/project_support访问文件夹大约需要 5-10 分钟,我知道是的

对于我的自动化不会因为这个问题而中断并且我不想添加一个常量sleep NNN,我使用until了循环,以便在安装挂载并且/project_support文件夹可用之前,我想睡 5 秒钟并检查文件夹是否存在,然后再继续在自动化脚本/逻辑中。

当对给定文件夹的命令成功(即退出状态)时,为什么第一个until循环仍在继续并且不退出条件检查?cd0第二个直到按预期工作。

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

[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]#

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

直到 [ `cd /project_support && pwd` ]; 做 ...; ...; 完毕
4

2 回答 2

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
于 2018-11-06T18:15:47.790 回答
2

您正在返回并测试一个空字符串,该字符串始终评估为假。

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时返回目录名称/路径,作为字符串eval 的值为 true。cd

尝试这个 -

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

这将测试目录的存在。

于 2018-11-06T18:04:51.007 回答