Возможно ли, чтобы команды 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 скрипта и запустить их в отдельных процессах, чтобы их можно было выполнить одновременно. Это действительно дикая догадка, но я думаю, вы получите ошибку доступа, если процесс пытается записать в файл, который читается другим процессом.
Ответ 6
Я думаю, что вы хотите, это концепция подоболочки. Здесь одна ссылка, которую я просто искал в google: http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshells.html