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


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

$ command1; command2

или если я только хочу command2 запустить только если command1 удастся, используя &&:

$ command1 && command2

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

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

2 61

2 ответа:

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

(command1; command2)

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

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

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

сравните это с логическим "или", ||, которая выполняет команды слева направо, пока один из них работает.

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

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

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

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

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

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

susp = ^Z; 

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