Come posso cancellare il resto di un elenco di comandi in Bash?


10

In Bash, ogni tanto scrivo un elenco di comandi e Enterpremo, e solo più tardi realizzerò che c'è un errore con un comando vicino alla fine dell'elenco. So che se premo Ctrl+ Cterminerà il comando attualmente in esecuzione e annullerà il resto dell'elenco. Esiste un modo per annullare il resto dell'elenco senza terminare il comando attualmente in esecuzione?

Ad esempio, diciamo che ho digitato qualcosa di simile

foo; bar

o

foo && bar

dove fooè un comando a lungo termine che è molto importante non interrompere, e barfa qualcosa di irreversibile e indesiderato (diciamo, shutdown -h nowo rm -rf /). Mentre fooè ancora in esecuzione, c'è un modo generale per dire alla shell di lasciare che foofinisca ma non di correre bardopo? (Sì, potrei cambiare le autorizzazioni in barmodo che non sia eseguibile, ma non è particolarmente conveniente se barè qualcosa di simile rmche voglio usare nel frattempo, né funzionerà se non possiedo baro se barè incorporato.)


È possibile modificare l'ultimo barcomando in some_command: ^bar^some_commandprima di essere eseguito.
GAD3R,

3
@ GAD3R: ma questo non modificherà la riga corrente, ne inizierà una nuova.
Arkadiusz Drabczyk il

Risposte:


3

Ho osservato che l'utilizzo CtrlZdi spostare il programma su un processo in background fa il trucco.

foo && bar

Grazie a @Arkadiusz Drabczyk per averlo indicato nei commenti che foo; barnon danno il controllo nel modo richiesto.

Poi:

^Z

[1]+  Stopped                 foo

Il comando arresta solo la prima attività e

fg %1

Questo porta solo l'attività fooin primo piano e completa l'attività ed esce.

PS: questo può essere verificato con due script che scrivono in un file. Il primo a dormire per qualche secondo per dare il tempo di essere rimesso.

Mi sono perso sul perché CtrlZgestisce solo il comando in esecuzione e lascia il resto. Mi piacerebbe conoscerlo.


1
Non riesco a riprodurlo. Quale bashversione usi? Io uso GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu). Ho scritto 2 script bash che scrivono in diversi file write1.sh:: pastebin.com/rbKmdWgB e write2.sh: pastebin.com/bNx3VRws . Io li corro così: ./write1.sh ; ./write2.sh. Il primo script risuona wrote 1per alcune volte, premo C-z, dice [1]+ Stopped ./write1.she posso vedere immediatamente l'output del secondo script: wrote 2essere ripetutamente ripetuto.
Arkadiusz Drabczyk,

2
Penso che il motivo per cui questo metodo funziona con le command1 && command2pipeline sia che Control-zinvia SIGCHLDsegnali al processo. Può essere verificato con echo $?. Bashquindi vede che il primo processo non è stato completato correttamente e non esegue i processi successivi.
Arkadiusz Drabczyk il

Sto usando GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16). Sì, penso che tu abbia ragione. foo; barnon può essere controllato nel modo desiderato. Ma possiamo fare l'arresto richiesto del secondo processo con Ctrl+Zse l'esecuzione del comando è foo && bar. Aggiornerò la risposta. Grazie per averlo precisato.
Revanth Chetluru,

@ArkadiuszDrabczyk non invia Ctrl-Z a SIGTSTP?
muru,

@RevanthChetluru nota che barè ancora sospeso e si presenta in jobsoutput, quindi probabilmente dovrebbe essere ucciso anche.
muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.