In Bash werde ich gelegentlich eine Liste von Befehlen eingeben und drücken Enterund erst später feststellen, dass am Ende der Liste ein Fehler mit einem Befehl vorliegt. Ich weiß, dass wenn ich Ctrl+ drücke C, der aktuell ausgeführte Befehl beendet und der Rest der Liste abgebrochen wird. Gibt es eine Möglichkeit, den Rest der Liste abzubrechen, ohne den aktuell ausgeführten Befehl zu beenden?
Nehmen wir zum Beispiel an, ich habe so etwas eingegeben
foo; bar
oder
foo && bar
Wo foo
ist ein lang laufender Befehl, dass es sehr wichtig ist, nicht zu unterbrechen, und bar
etwas irreversibles und unerwünschtes tut (sagen wir shutdown -h now
oder rm -rf /
). Gibt foo
es eine allgemeine Möglichkeit, der Shell zu sagen, dass sie foo
fertig sein soll, aber nicht bar
danach laufen soll, während sie noch läuft ? (Ja, ich könnte die Berechtigungen bar
so ändern , dass sie nicht ausführbar sind, aber das ist nicht besonders praktisch, wenn ich so bar
etwas rm
in der Zwischenzeit verwenden möchte, und es funktioniert auch nicht, wenn ich es nicht besitze bar
oder wenn bar
es integriert ist.)
quelle
bar
Befehl insome_command
: ändern ,^bar^some_command
bevor er ausgeführt wird.Antworten:
Ich habe beobachtet, dass CtrlZdas Verschieben des Programms in einen Hintergrundprozess den Trick macht.
Vielen Dank an @Arkadiusz Drabczyk für den Hinweis in Kommentaren,
foo; bar
die nicht die erforderliche Kontrolle geben.Dann:
Der Befehl stoppt nur die erste Aufgabe und
Dies bringt nur die Aufgabe
foo
in den Vordergrund und schließt die Aufgabe ab und beendet sie.PS: Dies kann mit zwei Skripten überprüft werden, die in eine Datei schreiben. Der erste, der ein paar Sekunden schläft, um Zeit zum Zurücksetzen zu haben.
Ich habe keine Ahnung, warum der CtrlZBefehl nur ausgeführt wird und der Rest übrig bleibt. Würde gerne kennenlernen.
quelle
bash
Version benutzt du? Ich benutzeGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
. Ich schrieb 2 Bash - Skripte , dass Schreiben auf verschiedene Dateien:write1.sh
: pastebin.com/rbKmdWgB undwrite2.sh
: pastebin.com/bNx3VRws . Ich führe sie so :./write1.sh ; ./write2.sh
. Das erste Skript halltwrote 1
ein paar Mal wider , ich drückeC-z
, es heißt[1]+ Stopped ./write1.sh
und ich kann sofort die Ausgabe des zweiten Skripts sehen:wrote 2
wiederholt wiederholt werden.command1 && command2
Pipelines funktioniert, ist, dass sie ein Signal an den ProzessControl-z
sendetSIGCHLD
. Es kann mit überprüft werdenecho $?
.Bash
stellt dann fest, dass der erste Prozess nicht erfolgreich abgeschlossen wurde und die nächsten Prozesse nicht ausgeführt werden.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
. Ja, ich denke du hast recht.foo; bar
kann nicht auf die gewünschte Weise gesteuert werden. Aber wir können den erforderlichen Stopp des zweiten Prozesses mitCtrl+Z
ausführen, wenn der Befehl ausgeführt wirdfoo && bar
. Ich werde die Antwort aktualisieren. Vielen Dank für den Hinweis.bar
immer noch ausgesetzt ist und in derjobs
Ausgabe angezeigt wird, sollte wahrscheinlich auch getötet werden.