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