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

Я столкнулся с проблемой головной боли.

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

myCommand &

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

myCommand1 && myCommand2

или

myCommand1 ; myCommand2

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

myCommand1 & && myCommand2 &

или

myCommand1 & ; myCommand2 &

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

13
задан 29 July 2018 в 16:44

2 ответа

Используйте ().

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

(myCommand1; myCommand2) &

или

(myCommand1 &) && (myCommand2 &)

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

myCommand1 & myCommand2 &
<час>

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

{ myCommand1 && myCommand2; } &
19
ответ дан 29 July 2018 в 16:44

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

myCommand1 & myCommand2 &

Это запускает myCommand1 и отправляет его в фоновый режим, за которым следует амперсанд, затем немедленно запускает myCommand2 и отправляет также это в фоновый режим, поэтому снова выпустив раковину.

Списки

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

Список - это последовательность из одного или нескольких конвейеров, разделенных одним из операторов , , и , и , или || и необязательно завершается одним из , , и или .

Если команда завершается оператором управления и , оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ожидает завершения команды, и возвращаемое состояние равно 0. Команды, разделенные ; , выполняются последовательно; оболочка ожидает завершения каждой команды по очереди. Статус возврата - это статус выхода последней выполненной команды.

Списки И и ИЛИ - это последовательности одного или нескольких конвейеров, разделенных управляющими операторами и и || соответственно.
Источник: 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

Job Control

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

  • Ctrl + Z вводит символ suspend , который вызывает остановку процесса, запущенного в данный момент на переднем плане, он не завершается, но остается в списке jobs
  • 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 ожидает завершения фонового процесса и возвращает его состояние завершения:

     wait %1 # 1st process in the jobs list
    

    Представьте, что вы начали длительный процесс (jobs показывает это номер 3), а затем понять, что вы хотите, чтобы компьютер был приостановлен завершается, когда завершается, плюс echo сообщение, если процесс не удался:

     wait %3 || echo failed ; systemctl suspend
    
15
ответ дан 29 July 2018 в 16:44

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

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