Як я можу скасувати решту списку команд у Bash?


10

У 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перед виконанням.
GAD3R

3
@ GAD3R: але це не змінить поточний рядок, він почне новий.
Аркадіуш Драбчик

Відповіді:


3

Я зауважував, що використання CtrlZперемикання програми на фоновий процес робить свою справу.

foo && bar

Дякуємо @Arkadiusz Drabczyk за те, що він вказав у коментарях, які foo; barне дають контролювати необхідним чином.

Тоді:

^Z

[1]+  Stopped                 foo

Команда зупиняє лише перше завдання і

fg %1

Це виводить лише завдання fooна перший план і завершує завдання та завершує роботу.

PS: Це можна перевірити двома сценаріями запису у файл. Перший спить кілька секунд, щоб дати час покласти назад.

Я розгублений, чому CtrlZобробляє лише команду, що працює, а решту залишає. Дуже хотів би познайомитися.


1
Я не можу його відтворити. Яку 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повторюється повторно.
Аркадіуш Драбчик

2
Я думаю, що причина того, що цей метод працює з command1 && command2трубопроводами, полягає в тому, що він Control-zпередає SIGCHLDсигнал процесу. Це можна перевірити за допомогою echo $?. Bashпотім бачить, що перший процес не закінчився успішно і не виконує наступні процеси.
Аркадіуш Драбчик

Я використовую GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16). Так, я думаю, ти маєш рацію. foo; barне можна контролювати бажаним чином. Але ми можемо зробити необхідну зупинку другого процесу, Ctrl+Zякщо команда виконується foo && bar. Я оновлю відповідь. Дякую, що вказали на це.
Revanth Chetluru

@ArkadiuszDrabczyk не надсилає Ctrl-Z SIGTSTP?
муру

@RevanthChetluru зауважив, що barвсе ще призупинено і відображається у jobsвиході, тому його, мабуть, теж слід вбити.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.