Я полагаю, вы хотите это:
myCommand1 & myCommand2 &
Он запускается myCommand1
и отправляет его в фоновый режим, за которым следует амперсанд, а затем немедленно запускается myCommand2
и отправляет его также в фоновый режим, поэтому снова запускается оболочка.
Списки
Для лучшего понимания вы можете заменить трубопровод с помощью команды здесь.
Список - это последовательность одного или нескольких конвейеров, разделенных одним из операторов ; , & , && или || и необязательно прекращается одним из
; , & , или ,
Если команда завершается оператором управления & , оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ожидает завершения команды, и возвращается статус 0. Команды, разделенные символом a ; выполняются последовательно; оболочка ожидает завершения каждой команды по очереди. Статус возврата - это статус выхода последней выполненной команды.
Списки AND и OR являются последовательностями одного или нескольких конвейеров, разделенных символами && и || управляющие операторы соответственно.
Источник: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>
. Точка с запятой ;
служит той же цели, особенно в сценариях. &
Однако Ampersand запускает команду (-и) в подоболочке в фоновом режиме, немедленно выпуская оболочку.
Вы можете использовать круглые ()
или фигурные скобки {}
для дальнейшей группировки списков, с той разницей, что круглые скобки порождают подоболочки, а фигурные - нет. Кудрявые скобки требуют пробела после первой и точки с запятой или новой строки перед закрывающей скобкой. Например:
# 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
списке
- 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