Die meisten Shells bieten Funktionen wie &&
und, ;
um die Ausführung von Befehlen auf bestimmte Weise zu verketten. Aber was ist, wenn ein Befehl bereits ausgeführt wird? Kann ich trotzdem einen weiteren Befehl hinzufügen, der abhängig vom Ergebnis des ersten ausgeführt werden soll?
Angenommen, ich bin gerannt
$ /bin/myprog
some output...
aber ich wollte wirklich /bin/myprog && /usr/bin/mycleanup
. Ich kann nicht myprog
alles töten und neu starten, weil zu viel Zeit verloren gehen würde. Ich kann Ctrl+ Zes und fg
/ bg
falls erforderlich. Kann ich damit einen anderen Befehl verketten?
Ich bin hauptsächlich an Bash interessiert, aber Antworten für alle gängigen Shells sind willkommen!
%
,%1
und$!
. Es ist wichtig, die PID anzugeben, da sonst der zweite Befehl immer ausgeführt wird.wait
liefert nicht das gewünschte Ergebnis. Es ist üblich, die Kurzformulare zu verwenden, da sie weniger anfällig für Tippfehler sind.fg
kehrt mit dem Exit-Code aus dem wiederaufgenommenen Programm zurück. Sie können daher Ihr Programm mit anhalten ^Zund anschließendfg && ...
mit fortsetzen.quelle
myprog
zweiten Anhalten wird der Vorgangfg
mit dem Exit-Code 20 abgebrochen, der nicht Null ist, sodass der verkettetemycleanup
Befehl nicht ausgeführt wird.Sie sind sich nicht sicher, ob das, wonach Sie fragen, möglich ist, aber wenn Sie immer noch die Shell haben, von der aus Sie das Programm gestartet haben, können Sie immer nach dem Beendigungsstatus
$?
des letzten Prozesses suchen:quelle
wait
Befehl in Bash.Befindet sich der Job im Vordergrund, verhält sich jeder dieser Befehle wie erwartet.
HINWEIS: $? wird den Rückgabestatus des laufenden Programms enthalten, wenn es beendet wird.
Hier wird explizit angegeben, was die Shell tun würde, wenn Sie den Befehl ursprünglich eingegeben hätten.
Wenn der erste Befehl nicht ausliest
stdin
und im Vordergrund ausgeführt wird, kann der neue Befehl eingegeben werden, während der erste Befehl ausgeführt wird. Die Shell liest es und führt es aus, wenn der erste Befehl ausgeführt wird. Wenn der Befehl im Hintergrund ausgeführt wird, ist es unwahrscheinlich, dass er gelesen wirdstdin
.BEARBEITEN: Sie können den Job auch in den Hintergrund stellen und den
WAIT
Befehl verwenden. Dies muss mit Vorsicht erfolgen, wenn andere Jobs auch im Hintergrund ausgeführt wurden. Eine Auftragsspezifikation ist erforderlich, damit derWAIT
Befehl den Status des Auftrags zurückgibt, auf den gewartet wurde.quelle
wait
ist auch nicht ideal. Der Vorteil, IMO, ist, dass wir eine klarere API haben, mit der wir es zu tun haben. Weitere Befehle in der Befehlszeile einzugeben, nachdem etwas ausgeführt wurde, schien mir ein wenig hacky zu sein.wait
leidet immer noch daran, keine direkte Verbindung zu der laufenden PID zu erhalten, während der Rückgabestatus angezeigt wird. Dies scheint eher ein Problem zu sein, wenn Bash die Dinge implementiert: stackoverflow.com/questions/356100/… . Das könnte also so gut sein, wie es nur geht.