Подтвердить что ты не робот

Синтаксис двойной точки с запятой (;;)

Я пытаюсь найти способ запуска нескольких команд параллельно в sh и дождаться завершения. Я обнаружил, что следующее не работает (sh: 1: Syntax error: ";" unexpected):

sh -c '(sleep 3 && echo 1) & ; (sleep 3 && echo 2) & ;  wait'

Но этот синтаксис работает так, как ожидалось:

sh -c '(sleep 3 && echo 1) & ;; (sleep 3 && echo 2) & ;;  wait'

Но я не понимаю, в чем разница. Мой вопрос в том, что означает ;; и когда он должен использоваться?

4b9b3361

Ответ 1

;; используется только в конструкциях case, чтобы указать конец альтернативы. (Здесь присутствует break в C.)

case $answer in
  yes) echo 'yay!';;
  no) echo 'boo!';;
esac

Синтаксически, ; и & оба означают конец команды. Новая строка эквивалентна ; в первом приближении. Разница между ними заключается в том, что ; или новая строка указывает, что команда должна выполняться на переднем плане, тогда как & указывает, что команда должна выполняться в фоновом режиме.

Итак, вам нужно & wait. & ; является синтаксической ошибкой (у вас не может быть пустой команды). & ;; также является синтаксической ошибкой; пепел отпускает (как будто вы написали только &), но bash жалуется. Очевидно, что ваш sh является некоторым вариантом пепла (например, тире, которая /bin/sh для многих производных Debian).

Ответ 2

Он должен использоваться в операторе case между случаями. Проблема, с которой вы сталкиваетесь, заключается в том, что оба & и ; являются разделителями команд, и вы должны использовать только один из них.