Intereting Posts
Как зеркалировать еще один диск на существующей файловой системе Как я могу изменить домашний каталог сервера sftp на MAC OS X? fedora на asus-трансформаторе? Рабочий стол полностью замерзает при операциях ввода / вывода SSH-вызов не видит правильный $ path, который существует на сервере Есть ли какие-либо «неживые» дистрибутивы Linux, которые можно запускать с USB-накопителя, и разрешать доступ к файлам из Windows? apt-get не обновляет openssl на debian 7 Какова соответствующая команда freebsd этих команд rpm? Сохраняйте только строки, содержащие точное количество разделителей Как GnuPG выводит на консоль, в то время как stdout и stderr перенаправляются на / dev / null Почему нет команды оболочки для создания файлов? Сравнение бок о бок с более чем двумя файлами, содержащими числовые значения Использовать утилиты lockfile-progs ntpdate -d кажется успешным, но ntpdate не возвращает серверу используя ожидание: как распечатать сообщение на экране, а не в открывшемся файле журнала

Почему двойные амперсанды и скопированные условия повторяются вместе вместе с последним?

У меня есть некоторые условия для выполнения некоторых фоновых заданий:

condition-command && condition-command && background-job & 

Проблема в том, что я хочу, чтобы условия блокировались до выполнения задания, как если бы я запускал:

 condition-command; condition-command; background-job & 

Но это не условие, если предыдущая команда не работает, я не хочу, чтобы задание выполнялось.

Я понял, что он асинхронный, но он не должен, на мой взгляд, оба следующих сценария должны быть одинаковыми, но они этого не делают:

 sleep 2; echo foo & sleep 1; echo bar; wait # prints foo, then bar: correct sleep 2 && echo foo & sleep 1; echo bar; wait # prints bar, then foo: bug 

Я знаю, тестирую ли я $? переменная, это сработало бы, или если бы я поместил последнюю в подсечку (но тогда я бы потерял контроль над заданиями, я хочу избежать демонов), но я хочу знать, почему bash делает это таким образом, где это задокументировано? Есть ли способ предотвратить такое поведение?

Edit: Chained, if s отвратительно, поэтому я не буду принимать его как альтернативный способ.
Редактирование 2: Я знаю, что подоболочка возможна, но для меня это не сработает, предположим, я хочу запустить кучу команд, а затем wait в конце. Это будет возможно, если я проверю наличие каталога /proc/$PID , но это будет боль в шее, если есть несколько заданий.
Редактировать 3: Главный вопрос: ПОЧЕМУ bash делает это, где он задокументирован? Независимо от того, имеет ли это решение, бонус!

Если вы не хотите, чтобы фон применялся ко всей строке, используйте eval :

 sleep 2 && eval 'sleep 10 &' 

Теперь только вторая команда будет фоновой работой, и это будет надлежащее фоновое задание, которое вы можете wait .

После вашего редактирования: проблема в том, что && имеет более высокий приоритет, чем & , поэтому вся вещь связывается вместе в AND list и получает информацию в виде единицы. См. Списки команд в руководстве, хотя это не очень понятно.

Наименьшее изменение вашего исходного кода, которое будет работать,

 if condition-command && condition-command; then background-job & fi 

(это, if , но не цепной).


Просто

 condition-command && condition-command && (background-job &) 

должен сделать трюк.