До цикла - почему он все еще работает, когда условие выполняется - PullRequest
0 голосов
/ 06 ноября 2018

Linux : Red Hat Enterprise Linux Server версии 6.5 (Сантьяго)

BASH : GNU bash, версия 4.1.2 (1) -релиз (x86_64-redhat-linux-gnu)

Одна из виртуальных машин, которую я только что подготовил, все еще ждет, пока DNS обновит записи своего узла, и одна из них имеет NAS, который смонтирован в папке /project_support. Доступ к папке /project_support занимает около 5-10 минут, да, я знаю .

Чтобы моя автоматизация не прервалась из-за этой проблемы, и я не хотел добавлять константу sleep NNN, я использовал цикл until, чтобы до монтирования монтирования и до папки /project_support я хотел спите в течение 5 секунд и проверьте наличие папки, прежде чем продолжить в скрипте / логике автоматизации.

Почему первый цикл until продолжается и не завершается при проверке состояния, когда команда cd в заданную папку является успешной или статусом выхода 0? Второй пока работает должным образом ,

Для 2-го цикла до, даже если я создаю папку (из второго терминала, пока цикл не запущен), она все равно не прерывает цикл до.

[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 голосов
/ 06 ноября 2018
until [ `cd /project_support` ]

Обратные метки фиксируют вывод cd, который представляет собой пустую строку независимо от того, существует ли названный каталог (сообщения об ошибках выводятся в stderr и не фиксируются). Затем квадратные скобки проверяют, является ли эта строка пустой, как всегда.

Ненужные квадратные скобки - распространенное недочёты при написании сценариев. Избавьтесь от них и запинок.

until cd /project_support; do
    ...
done

Обратите внимание, что, поскольку cd больше не выполняется в под-оболочке, он действительно вступит в силу, когда это удастся. Чтобы предотвратить это, вы можете добавить явную вложенную оболочку:

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

Или, если вы просто ждете, пока каталог не существует, проверьте это напрямую:

until [[ -d /project_support ]]; do
    ...
done
0 голосов
/ 06 ноября 2018

Вы возвращаете и тестируете пустую строку, которая всегда оценивается как ложная.

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 в качестве true.

попробуйте это -

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

, который проверит наличие каталога.

...