Подтвердить что ты не робот

Bash: выполните одну команду за другой, даже если я приостановил первую (Ctrl-z)

Я знаю в bash Я могу запускать одну команду за другой, разделяя их точкой с запятой, например

$ command1; command2

Или, если я хочу, чтобы command2 выполнялся только в том случае, если command1 преуспевает, используя &&:

$ command1 && command2

Это работает, но если я приостанавливаю command1 с помощью Ctrl-z, в первом случае он запускает command2 сразу, а во втором случае он не запускает его вообще. Как я могу запускать команды последовательно, но все же могу приостановить первую команду, но не выполнить второй запуск, пока я не перезапустил его (с помощью fg), и он закончит? Я бы предпочел, чтобы что-то было просто напечатать, насколько это возможно, поскольку я хотел бы сделать это в интерактивном режиме. Или, может быть, мне просто нужно установить опцию где-нибудь.

Кстати, что такое правильный термин для Ctrl-z?

4b9b3361

Ответ 1

Следующее должно сделать это:

(command1; command2)

Обратите внимание на добавленные скобки.

Ответ 2

В Bash, когда вы помещаете задание в фоновый режим (используя CTRL + Z или &), он не ждет завершения задания и дает код выхода с нулевым значением (успех). Это многое вы заметили, и оно задокументировано на страницах man.

Поведение логического "И", & &, является то, что оно проверяет слева направо. Каждая часть должна быть успешной, поэтому, если первая не увенчалась успехом, вторая не будет работать. Таким образом, с && он запускает команды слева направо, пока один из них не сработает. Определение успеха - это код выхода ($?), Равный нулю.

Контрастируйте это с помощью логического "ИЛИ", ||, который запускает команды слева направо, пока один из них не работает.

Объяснение решения подоболочки, которое дает @NPE, также можно найти на страницах man:

Составные команды и командные последовательности формы 'a; b; c не обрабатывается изящно, когда происходит приостановка процесса. Когда процесс останавливается, оболочка немедленно выполняет следующую команду в последовательности. Достаточно поместить последовательность команд между круглыми скобками, чтобы принудительно включить ее в подоболочку, которая может быть остановлена ​​как единица.

Правильный термин для CTRL + Z является символом приостановки, снова с man страниц:

Ввод символа приостановки (обычно ^ Z, Control-Z) во время запуска процесса приводит к тому, что процесс останавливается и возвращает управление bash.

(Извините, чтобы процитировать страницы man так много, но они действительно ваши друзья и заслуживают внимания)

Если вы посмотрите stty -a, вы увидите что-то вроде этого:

susp = ^Z; 

Итак, вы можете изменить его, отсюда фраза "обычно". Не делайте этого, хотя, это смущает черт из всех. Драйвер терминала вызывает сигнал SIGTSTP, который находится в ловушке от bash.