До цикла - почему он все еще работает, когда условие выполняется
Linux: Red Hat Enterprise Linux Server версии 6.5 (Сантьяго)
BASH: GNU bash, версия 4.1.2(1)-релиз (x86_64-redhat-linux-gnu)
Одна из виртуальных машин, которую я только что подготовил, все еще ждет, пока DNS обновит записи своего узла, и одна из них имеет NAS, который смонтирован на /project_support
папка. Это займет около 5-10 минут для /project_support
папка будет доступна, да плохо я знаю.
Поскольку моя автоматизация не сломалась из-за этой проблемы, и я не хотел добавлять константу 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]#
Почему эта проблема исправлена, когда я:?
до [ `cd /project_support && pwd` ]; делать...; ...; сделанный
2 ответа
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
Вы возвращаете и тестируете пустую строку, которая всегда оценивается как ложная.
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 ]] # ...
это будет проверять наличие каталога.