В Bash иногда я набираю список команд и нажимаю Enter, и только позже понимаю, что есть ошибка с какой-то командой в конце списка. Я знаю, что если я нажму Ctrl+, Cэто прервет текущую команду и отменит оставшуюся часть списка. Есть ли способ отменить оставшуюся часть списка без завершения текущей запущенной команды?
Например, допустим, я набрал что-то вроде
foo; bar
или
foo && bar
где foo
это долгосрочная команда, которую очень важно не прерывать, и она bar
делает что-то необратимое и нежелательное (скажем, shutdown -h now
или rm -rf /
). Пока foo
все еще работает, есть ли общий способ сообщить оболочке, чтобы она foo
заканчивала работу, но не запускалась bar
впоследствии? (Да, я мог бы изменить разрешения для bar
того, чтобы он не выполнялся, но это не особенно удобно, если я хочу использовать bar
что-то вроде rm
этого, и не будет работать, если я не являюсь владельцем bar
или если bar
он встроен.)
источник
bar
команду наsome_command
:^bar^some_command
перед выполнением.Ответы:
Я заметил, что использование CtrlZдля перевода программы в фоновый режим делает свое дело.
Спасибо @Arkadiusz Drabczyk за то, что он указал на это в комментариях, которые
foo; bar
не дают контроля требуемым образом.Потом:
Команда останавливает только первую задачу и
Это выводит только задачу
foo
на передний план и завершает задачу и завершает работу.PS: Это можно проверить с помощью двух скриптов, записывающих в файл. Первый спит несколько секунд, чтобы дать время вернуться.
Я заблудился от того, почему CtrlZобрабатывает только запущенную команду и оставляет все остальное. Хотел бы узнать.
источник
bash
версию вы используете? Я используюGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
. Я написал 2 скрипта bash, которые пишут в разные файлыwrite1.sh
:: pastebin.com/rbKmdWgB иwrite2.sh
: pastebin.com/bNx3VRws . Я запускаю их так./write1.sh ; ./write2.sh
. Первый сценарий повторяетсяwrote 1
несколько раз, я нажимаюC-z
, он говорит,[1]+ Stopped ./write1.sh
и я могу сразу увидеть вывод второго сценария:wrote 2
повторение неоднократно.command1 && command2
конвейерами, состоит в том, чтоControl-z
посылаетSIGCHLD
сигнал процессу. Это можно проверить с помощьюecho $?
.Bash
затем видит, что первый процесс не завершился успешно, и не выполняет следующие процессы.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
. Да, я думаю, что ты прав.foo; bar
не может контролироваться желаемым способом. Но мы можем выполнить необходимую остановку второго процесса сCtrl+Z
помощью команды runfoo && bar
. Я обновлю ответ. Спасибо за указание на это.bar
которое все еще приостановлено и отображается вjobs
выходных данных, так что, вероятно, его тоже следует уничтожить.