gpt4 book ai didi

linux - Until 循环 - 为什么它在条件为真时仍然有效

转载 作者:太空狗 更新时间:2023-10-29 11:30:59 25 4
gpt4 key购买 nike

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

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

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

为了我的自动化不会因为这个问题而中断,并且我不想添加常量 sleep NNN,我使用了 until 循环,这样直到挂载并且 /project_support 文件夹可用,我想休眠 5 秒钟并检查文件夹是否存在,然后再继续自动化脚本/逻辑。

当对给定文件夹的 cd 命令成功时,为什么第一个 until 循环继续而不退出条件检查,即退出状态 0 ? 第二个 until 按预期工作。

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

[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

最佳答案

until [ `cd /project_support` ]

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

不必要的方括号是一种常见的 shell 脚本缺陷。去掉它们和反引号。

until cd /project_support; do
...
done

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

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

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

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

关于linux - Until 循环 - 为什么它在条件为真时仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53177420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com