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

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

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 делает это, где он задокументирован? Независимо от того, имеет ли это решение, бонус!

2 Solutions collect form web for “Почему двойные амперсанды и скопированные условия повторяются вместе вместе с последним?”

Если вы не хотите, чтобы фон применялся ко всей строке, используйте 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 &) 

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

  • Чтобы добавить номера строк в каждой строке с помощью команды оболочки?
  • Использование скрипта Fifo
  • Как выполнить один и тот же набор команд в нескольких подкаталогах в числовом порядке?
  • Сценарий Bash не может распознавать переменную как часть пути
  • Помогите мне понять, почему эта функция bash не работает рекурсивно
  • График счета и совпадающие строки одновременно
  • используя переменную «файл», полученную из «for» файла «in», и перейти к другому скрипту не удалось
  • Как эта команда su -c "...", кажется, передает две команды вместо одной?
  • Regex - проверка скрипта для разрешенных символов
  • Родительский скрипт продолжается, когда ребенок выходит с ненулевым кодом выхода
  • Вывод трубы одной команды двум другим
  • Interesting Posts

    Отключить шифрование Arcfour

    Создание текстового файла списка записей в каталоге в корзине

    Как установить adb на Ubuntu из загрузки

    Скорость движения мыши установлена ​​на максимальную, но все же медленную

    Влияние файловой системы на скорость флеш-накопителя?

    Структура дерева каталогов rsync с ограниченной глубиной и исключение определенных папок

    не удалось открыть X-сервер

    Как настроить колесо мыши для прокрутки между окнами одной и той же группы?

    Запуск VNC-просмотра из окон 8.1 в Debian Jessie не работает

    Отключение su – <user1>

    Соедините каждую строку файла с определенной переменной во второй команде

    Беспроводная карта Intel 6300 не будет работать на CentOS 7 – работала во время установки, хотя!

    Как открыть неизвестный тип файловой системы с диска

    Поиск и замена вопроса

    Любой способ контролировать параметры настройки из командной строки?

    Linux и Unix - лучшая ОС в мире.