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

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

это будет проверять наличие каталога.

Другие вопросы по тегам