Я обычно запускаю несколько команд с чем-то вроде этого:
sleep 2 && sleep 3
или
sleep 2 ; sleep 3
но что, если я хочу запустить их обоих в фоновом режиме из одной команды командной строки?
sleep 2 & && sleep 3 &
не работает И ни один не делает замену &&
с;
Есть ли способ сделать это?
()
чтобы окружить команду.Ответы:
Как именно вы хотите, чтобы они запускались? Если вы хотите, чтобы они запускались в фоновом режиме и запускались последовательно , вы должны сделать что-то вроде этого:
Если, с другой стороны, вы хотите, чтобы они работали параллельно в фоновом режиме, вы можете вместо этого сделать это:
И эти два метода могут быть объединены, такие как:
Bash, будучи bash, часто для решения одной и той же задачи часто используют множество различных методов, хотя иногда с небольшими различиями между ними.
источник
sleep 2 && sleep 3 &
? Я попробовал это в Bash, и, кажется, работает так же (пробовал с эхо).sleep 2 && echo "foo" && sleep 3 & echo "bar""
?&&
Оператор говорит оболочке , чтобы выполнить команду перед ним, и только тогда , когда эта команда выполняется без каких - либо ошибок оболочка выполняет последующую команду. Это существенно отличается от того;
, что;
позволяет последующей команде выполняться независимо от состояния выхода предыдущей команды, если только это не было фатальной ошибкой.&
Говорит оболочке , чтобы выполнить все «Connected» команд , предшествующих его, в фоновом режиме. «подключен» здесь означает, что команда является частью pipe (|
) или логического оператора.Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.
в руководстве по bash.Вам нужно добавить несколько паренов в вашей последней версии -
или это тоже работает -
источник
&
, статус выхода всегда равен нулю. Итак, два приведенных выше случая делают одно и то же (оболочка выполняет обе стороны по очереди асинхронно ).для запуска нескольких фоновых команд необходимо добавить
&
конец каждой команды. например:(command1 &) && (command2 &) && (command3 &)
источник
Ответы выше используют круглые скобки. Bash также может использовать фигурные скобки для аналогичной цели:
Обратите внимание, что скобки более требовательны к синтаксису - требуется пробел после
{
, пробел до}
и последняя точка с запятой. В некоторых ситуациях брекеты более эффективны, потому что они не разворачивают новую подоболочку. В этом случае я не знаю, если это имеет значение.источник
{ sleep 2; sleep 3; } &
?Это работает:
Также вы можете сделать:
источник
У меня тоже такая же миссия. Я пытался
(sleep2 ; fg )& sleep3 ; fg
, это работает. И когда вы преуспеете, Ctrl + C удвоится, два процесса могут быть остановлены.источник
Вы можете использовать подстановку команд bash
$(command)
следующим образом:Обратите внимание, что stdin и stdout по-прежнему связаны с родительским процессом, и перенаправление, по крайней мере, stdout может быть сложным. Таким образом, в качестве альтернативы вы можете объединить команды в одну строку, а затем передать строку
bash
команде, чтобы породить новый процесс, который будет обрабатывать выполнение.Это особенно полезно в скрипте bash, когда вам нужно запустить несколько команд в фоновом режиме.
Эти два утверждения должны быть эквивалентны. Баш процесс икру в обоих случаях для обработки команды (цепь команд) и
&
в конце отсоединяет исполнения.На этот раз вы можете добавить
&>/dev/null
перед&
в конце команды, чтобы перенаправить как минимум стандартный вывод и избежать вывода на стандартный вывод родительского процесса. Что-то вроде:источник
Если вы хотите выполнить несколько команд последовательно , есть действительно простой метод, который работает везде: создание файла! Преимущество этого метода в том, что он чистый и простой.
Сначала создайте файл с именем, например
commands.sh
. Затем поместите свои команды там. Вот пример:commands.sh:
Хорошо, теперь мы на последнем этапе. Чтобы запустить команды в фоновом режиме (последовательно), просто запустите:
источник