Возможно ли, чтобы команды bash продолжались до результата предыдущей команды?

При запуске команд из bash script, bash всегда ждет завершения предыдущей команды или просто запускает команду, а затем переходит к следующей?

ie: Если вы запускаете следующие две команды из bash script, возможно ли, чтобы что-то не получилось?

cp /tmp/a /tmp/b
cp /tmp/b /tmp/c

Ответ 1

Да, если вы ничего не делаете, команды в bash script сериализуются. Вы можете сказать, что bash запускает кучу команд параллельно, а затем ждет их завершения, но делает что-то вроде этого:

command1 &
command2 &
command3 &
wait

Амперсанды в конце каждой из первых трех строк сообщают bash выполнить команду в фоновом режиме. Четвертая команда wait сообщает bash ждать, пока все дочерние процессы не выйдут.

Обратите внимание: если вы так поступите, вы не сможете получить статус выхода дочерних команд (и set -e не будет работать), поэтому вы не сможете определить, были ли они успешными или не удалось обычным способом.

bash manual содержит дополнительную информацию (поиск wait, примерно две трети пути вниз).

Ответ 2

добавить '&' в конце команды, чтобы запустить его параллельно. Однако это странно, потому что в вашем случае вторая команда зависит от конечного результата первого. Либо используйте последовательные команды, либо скопируйте их в b и c из следующего:

cp /tmp/a /tmp/b &
cp /tmp/a /tmp/c &

Ответ 3

Если вы явно не сообщите bash, чтобы запустить процесс в фоновом режиме, он будет ждать завершения процесса. Поэтому, если вы напишете это:

foo args &

bash будет продолжаться, не дожидаясь выхода foo. Но если вы явно не помещаете этот процесс в фоновом режиме, bash будет ждать его выхода.

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

Ответ 4

В общем случае, если явно не отправлено на задний план или не отключено в качестве демона, команды в оболочке script будут сериализованы.

Ответ 5

Они ждут завершения предыдущего. Однако вы можете написать 2 скрипта и запустить их в отдельных процессах, чтобы их можно было выполнить одновременно. Это действительно дикая догадка, но я думаю, вы получите ошибку доступа, если процесс пытается записать в файл, который читается другим процессом.