【问题标题】:Until loop - Why it's still working when the condition is true直到循环 - 为什么当条件为真时它仍然有效
【发布时间】:2018-11-06 17:58:35
【问题描述】:

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 秒并检查文件夹是否存在,然后再继续执行自动化脚本/逻辑。

为什么第一个 until 循环在继续执行条件检查时没有退出,当 cd 命令对给定文件夹成功又名退出状态 0 第二个直到作为预期的。

对于第二个 until 循环,即使我创建了文件夹(从第二个终端,while 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]#

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

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

【问题讨论】:

    标签: linux bash loops break until-loop


    【解决方案1】:
    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
    

    【讨论】:

    • 谢谢。这种情况就像做ls -l /project_folder 表明它存在,做cd /project_folder 错误,但是几分钟后它确实有效,如果我做mkdir -p /project_folder/dir1/subdir2 它会出错,说:mkdir: cannot create directory '/project_folder': File exists(不知道为什么它没有' t 在错误消息中反映 dir1/subdir2)我正在研究它,但我会使用上面列出的想法。由于这个詹金斯工作失败:02:15:45 Build step 'Execute shell' marked build as failure
    【解决方案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 成功时返回目录名称/路径,作为字符串 eval 为真。

    试试这个 -

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

    这将测试目录是否存在。

    【讨论】:

    • 当,我以为cd /folder 会返回true .. thx。问题是 -d /folder 有效,但 cd /folder 在某些情况下无效
    • 可能会做类似until [[ -d /project_folder && $(cd /project_folder && pwd) ]]
    • 啊。如果这是你想要的,你需要去掉括号。 until cd /project_support; then ... 根据John。不要将其包装在 [ 或反引号中。结果是一样的。
    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 2021-08-20
    • 2020-07-30
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多