Как я могу запускать несколько команд, которые имеют & amp; в одной командной строке?

Я столкнулся с проблемой головной боли. Я хочу выполнить команды mulitple в фоновом режиме, поэтому я хочу начать их в bash один за другим. Легко запускать команду в linux в фоновом режиме, как это:

myCommand &

Также легко запустить несколько команд, как это:

myCommand1 & myCommand2

или

myCommand1 ; myCommand2

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

myCommand1 & && myCommand2 &

или

myCommand1 & ; myCommand2 &

Оба формата терпят неудачу. Как запустить несколько команд с & в одной командной строке?

8
задан 29 December 2017 в 12:33

6 ответов

Использовать ().

Если вы хотите последовательно запускать их:

(myCommand1; myCommand2) &

или

(myCommand1 &) && (myCommand2 &)

Если вы хотите, чтобы они выполнялись параллельно :

myCommand1 & myCommand2 &

В bash вы также можете использовать это (пробел за {и the; обязательный):

{ myCommand1 && myCommand2; } &
13
ответ дан 22 May 2018 в 15:52
  • 1
    (myCommand1 &) && (myCommand2 &) будет работать myCommand2, даже если myCommand1 не удалось. – terdon♦ 29 December 2017 в 13:15
  • 2
    Rinzwind, Спасибо! Это действительно здорово! – Clock ZHONG 30 December 2017 в 18:07
  • 3
    () может помочь bash отличить & amp; и & amp; & amp;. Поэтому просто используйте () для разделения исполнительного блока, когда мы хотим использовать &; и & amp; & amp; вместе. – Clock ZHONG 30 December 2017 в 18:09

Использовать ().

Если вы хотите последовательно запускать их:

(myCommand1; myCommand2) &

или

(myCommand1 &) && (myCommand2 &)

Если вы хотите, чтобы они выполнялись параллельно :

myCommand1 & myCommand2 &

В bash вы также можете использовать это (пробел за {и the; обязательный):

{ myCommand1 && myCommand2; } &
13
ответ дан 18 July 2018 в 00:16

Использовать ().

Если вы хотите последовательно запускать их:

(myCommand1; myCommand2) &

или

(myCommand1 &) && (myCommand2 &)

Если вы хотите, чтобы они выполнялись параллельно :

myCommand1 & myCommand2 &

В bash вы также можете использовать это (пробел за {и the; обязательный):

{ myCommand1 && myCommand2; } &
13
ответ дан 24 July 2018 в 17:11

Я предполагаю, что вы хотите это:

myCommand1 & myCommand2 &

Это начинает myCommand1 и отправляет его на задний план, за которым следует амперсанд, затем сразу же запускает myCommand2 и отправляет его также на задний план, (! d1)

Списки

Для лучшего понимания вы можете заменить конвейер командой здесь.

Список представляет собой последовательность из одного или нескольких контуров, разделенных одним из операторов, & amp ;, & amp; & amp ;, или ||, и, возможно, завершен одним из,, или. Если команда завершена оператором управления & amp;, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ждет завершения команды, а статус возврата равен 0. Команды, разделенные символом a; выполняются последовательно; оболочка ожидает, что каждая команда будет завершена по очереди. Статус возврата - это статус выхода последней выполненной команды. И и ИЛИ представляют собой последовательности одного или нескольких конвейеров, разделенных символом & amp; и || соответственно. Источник: man bash

Давайте перейдем к примерам. Вы можете создать список, объединив команды и разделив их на один из следующих: ; & && ||:

command1 ; command2  # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2  # runs simultaneously

Вы можете завершить список одним из следующих: ; & <newline>. Обычно вы выполняете команду или список, нажимая Enter, что равно <newline>. Точка с запятой ; выполняет ту же самую цель, особенно в сценариях. Амперсанд &, однако, запускает команду (ы) в подоболочке в фоновом режиме, немедленно освобождая оболочку.

Вы можете использовать круглые () или фигурные скобки {} для дальнейших групповых списков, разницу что круглые скобки порождают подоболочку, а фигурные - нет. Кудрявые скобки должны иметь место после первого и точки с запятой или новой строки перед закрывающей скобкой. Например:

# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) & 
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &

Это может стать довольно сложным, если вы не уверены в использовании true и false, чтобы проверить, работает ли работа как ожидалось:

$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2
[d30 ] Управление заданиями

Команда jobs отображает список текущих заданий фона, которые были выполнены или недавно были завершены в текущей оболочке. Существует ряд сочетаний клавиш и команд для управления заданиями:

Ctrl + Z создает символ приостановки, который заставляет остановить текущий процесс на переднем плане, он не завершен, но остается в [ f22] list Ctrl + Y задает задержанный символ приостановки, который заставляет процесс, который в настоящее время выполняется на переднем плане, останавливаться, когда он пытается прочитать ввод с терминала fg = %, приносит процесс на передний план, запуская его, если необходимо, вы можете указать процесс следующим образом:
 %       # last process in the jobs list
 %1      # 1st process in the jobs list
 %abc    # process beginning with the string “abc”
 %?abc   # process containing the string “abc” anywhere
bg = %& берет процесс в фоновом режиме, запуская его, если необходимо:
 %&      # last process in the jobs list
 %1&     # 1st process in the jobs list
 %abc&   # process beginning with the string “abc”
 %?abc&  # process containing the string “abc” anywhere
wait ожидает завершения фонового процесса и возвращает его статус завершения: f7] Представьте, что вы начали длительный процесс (jobs показывает, что это номер 3), а затем понимаете, что вы хотите, чтобы компьютер был приостановлен, когда он заканчивается, плюс echo сообщение, если процесс не удался:
 wait %3 || echo failed ; systemctl suspend
13
ответ дан 22 May 2018 в 15:52
  • 1
    Но важно быть осторожным с & amp; & amp; это зависит от того, что возвращает команда , поэтому мы должны быть уверены, что все, что мы называем, действительно возвращает что-то bash, считает правдивое значение ..? – mathreadler 29 December 2017 в 23:17
  • 2
    @mathreadler Если вы не говорите о некоем плохо написанном пользовательском скрипте, значение выхода очень хорошо определено (см. man bash ) и широко используется точно так, как это предполагалось. AFAIK - я никогда не испытывал ничего странного. – dessert 30 December 2017 в 00:01
  • 3
    в точности, нужно быть осторожным относительно плохо сделанных пользовательских скриптов. Они существуют и могут быть болью, чтобы найти такие ошибки. Askubuntu не позволяет мне «@ десерт». вы. – mathreadler 30 December 2017 в 00:11
  • 4
    Ах, хорошо, это имеет смысл теперь, когда вы упомянули об этом. – mathreadler 30 December 2017 в 00:14

Я предполагаю, что вы хотите это:

myCommand1 & myCommand2 &

Это начинает myCommand1 и отправляет его на задний план, за которым следует амперсанд, затем сразу же запускает myCommand2 и отправляет его также на задний план, (! d1)

Списки

Для лучшего понимания вы можете заменить конвейер командой здесь.

Список представляет собой последовательность из одного или нескольких контуров, разделенных одним из операторов, & amp ;, & amp; & amp ;, или ||, и, возможно, завершен одним из,, или. Если команда завершена оператором управления & amp;, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ждет завершения команды, а статус возврата равен 0. Команды, разделенные символом a; выполняются последовательно; оболочка ожидает, что каждая команда будет завершена по очереди. Статус возврата - это статус выхода последней выполненной команды. И и ИЛИ представляют собой последовательности одного или нескольких конвейеров, разделенных символом & amp; и || соответственно. Источник: man bash

Давайте перейдем к примерам. Вы можете создать список, объединив команды и разделив их на один из следующих: ; & && ||:

command1 ; command2 # runs sequentially command1 && command2 # runs sequentially, runs command2 only if command1 succeeds command1 || command2 # runs sequentially, runs command2 only if command1 fails command1 & command2 # runs simultaneously

Вы можете завершить список одним из следующих: ; & <newline>. Обычно вы выполняете команду или список, нажимая Enter, что равно <newline>. Точка с запятой ; выполняет ту же самую цель, особенно в сценариях. Амперсанд &, однако, запускает команду (ы) в подоболочке в фоновом режиме, немедленно освобождая оболочку.

Вы можете использовать круглые () или фигурные скобки {} для дальнейших групповых списков, разницу что круглые скобки порождают подоболочку, а фигурные - нет. Кудрявые скобки должны иметь место после первого и точки с запятой или новой строки перед закрывающей скобкой. Например:

# if c1 succeeds start a shell in the background # and run c2 and c3 sequentially inside it c1 && ( c2 ; c3 ) & # run c1 and if it succeeds c2 sequentially as a group command # if c1 or c2 fail run c3 in the background { c1 && c2 ;} || c3 &

Это может стать довольно сложным, если вы не уверены в использовании true и false, чтобы проверить, работает ли работа как ожидалось:

$ { true && true ;} || echo 2 $ { true && false ;} || echo 2 2

Управление заданиями

Команда jobs отображает список текущих заданий фона, которые были выполнены или недавно были завершены в текущей оболочке. Существует ряд сочетаний клавиш и команд для управления заданиями:

Ctrl + Z создает символ приостановки, который заставляет остановить текущий процесс на переднем плане, он не завершен, но остается в jobs list Ctrl + Y задает задержанный символ приостановки, который заставляет процесс, который в настоящее время выполняется на переднем плане, останавливаться, когда он пытается прочитать ввод с терминала fg = %, приносит процесс на передний план, запуская его, если необходимо, вы можете указать процесс следующим образом: % # last process in the jobs list %1 # 1st process in the jobs list %abc # process beginning with the string “abc” %?abc # process containing the string “abc” anywhere bg = %& берет процесс в фоновом режиме, запуская его, если необходимо: %& # last process in the jobs list %1& # 1st process in the jobs list %abc& # process beginning with the string “abc” %?abc& # process containing the string “abc” anywhere wait ожидает завершения фонового процесса и возвращает его статус завершения: f7] Представьте, что вы начали длительный процесс (jobs показывает, что это номер 3), а затем понимаете, что вы хотите, чтобы компьютер был приостановлен, когда он заканчивается, плюс echo сообщение, если процесс не удался: wait %3 || echo failed ; systemctl suspend
13
ответ дан 18 July 2018 в 00:16

Я предполагаю, что вы хотите это:

myCommand1 & myCommand2 &

Это начинает myCommand1 и отправляет его на задний план, за которым следует амперсанд, затем сразу же запускает myCommand2 и отправляет его также на задний план, (! d1)

Списки

Для лучшего понимания вы можете заменить конвейер командой здесь.

Список представляет собой последовательность из одного или нескольких контуров, разделенных одним из операторов, & amp ;, & amp; & amp ;, или ||, и, возможно, завершен одним из,, или. Если команда завершена оператором управления & amp;, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ждет завершения команды, а статус возврата равен 0. Команды, разделенные символом a; выполняются последовательно; оболочка ожидает, что каждая команда будет завершена по очереди. Статус возврата - это статус выхода последней выполненной команды. И и ИЛИ представляют собой последовательности одного или нескольких конвейеров, разделенных символом & amp; и || соответственно. Источник: man bash

Давайте перейдем к примерам. Вы можете создать список, объединив команды и разделив их на один из следующих: ; & && ||:

command1 ; command2 # runs sequentially command1 && command2 # runs sequentially, runs command2 only if command1 succeeds command1 || command2 # runs sequentially, runs command2 only if command1 fails command1 & command2 # runs simultaneously

Вы можете завершить список одним из следующих: ; & <newline>. Обычно вы выполняете команду или список, нажимая Enter, что равно <newline>. Точка с запятой ; выполняет ту же самую цель, особенно в сценариях. Амперсанд &, однако, запускает команду (ы) в подоболочке в фоновом режиме, немедленно освобождая оболочку.

Вы можете использовать круглые () или фигурные скобки {} для дальнейших групповых списков, разницу что круглые скобки порождают подоболочку, а фигурные - нет. Кудрявые скобки должны иметь место после первого и точки с запятой или новой строки перед закрывающей скобкой. Например:

# if c1 succeeds start a shell in the background # and run c2 and c3 sequentially inside it c1 && ( c2 ; c3 ) & # run c1 and if it succeeds c2 sequentially as a group command # if c1 or c2 fail run c3 in the background { c1 && c2 ;} || c3 &

Это может стать довольно сложным, если вы не уверены в использовании true и false, чтобы проверить, работает ли работа как ожидалось:

$ { true && true ;} || echo 2 $ { true && false ;} || echo 2 2

Управление заданиями

Команда jobs отображает список текущих заданий фона, которые были выполнены или недавно были завершены в текущей оболочке. Существует ряд сочетаний клавиш и команд для управления заданиями:

Ctrl + Z создает символ приостановки, который заставляет остановить текущий процесс на переднем плане, он не завершен, но остается в jobs list Ctrl + Y задает задержанный символ приостановки, который заставляет процесс, который в настоящее время выполняется на переднем плане, останавливаться, когда он пытается прочитать ввод с терминала fg = %, приносит процесс на передний план, запуская его, если необходимо, вы можете указать процесс следующим образом: % # last process in the jobs list %1 # 1st process in the jobs list %abc # process beginning with the string “abc” %?abc # process containing the string “abc” anywhere bg = %& берет процесс в фоновом режиме, запуская его, если необходимо: %& # last process in the jobs list %1& # 1st process in the jobs list %abc& # process beginning with the string “abc” %?abc& # process containing the string “abc” anywhere wait ожидает завершения фонового процесса и возвращает его статус завершения: f7] Представьте, что вы начали длительный процесс (jobs показывает, что это номер 3), а затем понимаете, что вы хотите, чтобы компьютер был приостановлен, когда он заканчивается, плюс echo сообщение, если процесс не удался: wait %3 || echo failed ; systemctl suspend
13
ответ дан 24 July 2018 в 17:11
  • 1
    Но важно быть осторожным с & amp; & amp; это зависит от того, что возвращает команда , поэтому мы должны быть уверены, что все, что мы называем, действительно возвращает что-то bash, считает правдивое значение ..? – mathreadler 29 December 2017 в 23:17
  • 2
    @mathreadler Если вы не говорите о некоем плохо написанном пользовательском скрипте, значение выхода очень хорошо определено (см. man bash ) и широко используется точно так, как это предполагалось. AFAIK - я никогда не испытывал ничего странного. – dessert 30 December 2017 в 00:01
  • 3
    в точности, нужно быть осторожным относительно плохо сделанных пользовательских скриптов. Они существуют и могут быть болью, чтобы найти такие ошибки. Askubuntu не позволяет мне «@ десерт». вы. – mathreadler 30 December 2017 в 00:11
  • 4
    Ах, хорошо, это имеет смысл теперь, когда вы упомянули об этом. – mathreadler 30 December 2017 в 00:14

Другие вопросы по тегам:

Похожие вопросы: