Ответ 1
Следующее должно сделать это:
(command1; command2)
Обратите внимание на добавленные скобки.
Я знаю в bash Я могу запускать одну команду за другой, разделяя их точкой с запятой, например
$ command1; command2
Или, если я хочу, чтобы command2
выполнялся только в том случае, если command1
преуспевает, используя &&
:
$ command1 && command2
Это работает, но если я приостанавливаю command1
с помощью Ctrl-z
, в первом случае он запускает command2
сразу, а во втором случае он не запускает его вообще. Как я могу запускать команды последовательно, но все же могу приостановить первую команду, но не выполнить второй запуск, пока я не перезапустил его (с помощью fg
), и он закончит? Я бы предпочел, чтобы что-то было просто напечатать, насколько это возможно, поскольку я хотел бы сделать это в интерактивном режиме. Или, может быть, мне просто нужно установить опцию где-нибудь.
Кстати, что такое правильный термин для Ctrl-z
?
Следующее должно сделать это:
(command1; command2)
Обратите внимание на добавленные скобки.
В Bash, когда вы помещаете задание в фоновый режим (используя CTRL + Z или &), он не ждет завершения задания и дает код выхода с нулевым значением (успех). Это многое вы заметили, и оно задокументировано на страницах man
.
Поведение логического "И", & &, является то, что оно проверяет слева направо. Каждая часть должна быть успешной, поэтому, если первая не увенчалась успехом, вторая не будет работать. Таким образом, с && он запускает команды слева направо, пока один из них не сработает. Определение успеха - это код выхода ($?), Равный нулю.
Контрастируйте это с помощью логического "ИЛИ", ||, который запускает команды слева направо, пока один из них не работает.
Объяснение решения подоболочки, которое дает @NPE, также можно найти на страницах man
:
Составные команды и командные последовательности формы 'a; b; c не обрабатывается изящно, когда происходит приостановка процесса. Когда процесс останавливается, оболочка немедленно выполняет следующую команду в последовательности. Достаточно поместить последовательность команд между круглыми скобками, чтобы принудительно включить ее в подоболочку, которая может быть остановлена как единица.
Правильный термин для CTRL + Z является символом приостановки, снова с man
страниц:
Ввод символа приостановки (обычно ^ Z, Control-Z) во время запуска процесса приводит к тому, что процесс останавливается и возвращает управление bash.
(Извините, чтобы процитировать страницы man
так много, но они действительно ваши друзья и заслуживают внимания)
Если вы посмотрите stty -a
, вы увидите что-то вроде этого:
susp = ^Z;
Итак, вы можете изменить его, отсюда фраза "обычно". Не делайте этого, хотя, это смущает черт из всех. Драйвер терминала вызывает сигнал SIGTSTP, который находится в ловушке от bash.