Ich weiß, dass ich in bash einen Befehl nach dem anderen ausführen kann, indem ich sie durch Semikolons trenne, wie z
$ command1; command2
Oder wenn ich nur command2
ausführen möchte , wenn dies command1
erfolgreich ist, verwenden Sie &&
:
$ command1 && command2
Dies funktioniert, aber wenn ich die command1
Verwendung unterbreche Ctrl-z
, wird sie im ersten Fall command2
sofort ausgeführt, und im zweiten Fall wird sie überhaupt nicht ausgeführt. Wie kann ich Befehle nacheinander ausführen, aber dennoch den ersten Befehl anhalten, aber den zweiten Befehl erst ausführen, nachdem ich ihn (mit fg
) neu gestartet und beendet habe? Ich würde es vorziehen, etwas so einfach wie möglich zu tippen, da ich dies interaktiv tun möchte. Oder vielleicht muss ich einfach irgendwo eine Option einstellen.
Was ist übrigens der richtige Begriff für was Ctrl-z
?
command1; command2
sollte genau das tun, was Sie wollen. In Bezug auf die Terminologie setzt Strg-Z den Prozess aus.4.2.8(2)-release
unter Mac OS X 10.8 in iTerm2.Antworten:
Folgendes sollte es tun:
Beachten Sie die hinzugefügten Klammern.
quelle
command1; command2
,command1 && command 2
, und(command1; command2)
)?command1; command2
ist der aktive Job nur der Vorgang,command1
wenn Sie Strg-z drücken. Er wird also angehalten und der nächste Job (command2
) beginnt. Mit(command1; command2)
besteht der aktive Job aus der Unterschale, in der die beiden Befehle ausgeführt werden, sodass die gesamte Unterschale von Control-z angehalten wird. Sie können dies bestätigen, indem Sie denjobs
Befehl nach dem Anhalten ausführen.command1 && command2
Option? Das begegne ich häufig. Obwohl der Job aus beiden Befehlen zusammen besteht, habe ich auch festgestellt, dass der zweite Befehl nach dem Hintergrund nicht ausgeführt wird.(command1 && command2)
funktioniert natürlich, aber ich weiß oft nicht, dass ich einen Prozess im Voraus hinterfragen möchte. Sonst hätte ich es von Anfang an als Hintergrundjob ausgeführt.command1 && command2
ist eigentlich zwei Jobs (ein Job besteht aus einer Pipeline, und die&&
Liste besteht aus zwei (Einzelprozess-) Pipelinescommand1
undcommand2
). Der zweite Befehl wird erst ausgeführtcommand1
,command1
wenn er beendet wird (mit dem Status Null), und wird nicht beendet, wenn er gestoppt wird.Wenn Sie in Bash einen Job in den Hintergrund stellen (mit STRG + Z oder &), wartet er nicht auf den Abschluss des Jobs und gibt einen Beendigungscode von Null (Erfolg). So viel haben Sie beobachtet und es ist auf den
man
Seiten dokumentiert .Das logische "UND" && wird von links nach rechts getestet. Jeder Teil muss erfolgreich sein. Wenn der erste Teil nicht erfolgreich ist, wird der zweite nicht ausgeführt. Mit && werden also Befehle von links nach rechts ausgeführt, bis einer von ihnen fehlschlägt. Die Definition von Erfolg ist ein Exitcode ($?) Von Null.
Vergleichen Sie dies mit dem logischen "ODER" ||, das Befehle von links nach rechts ausführt, bis einer von ihnen funktioniert .
Erläuterungen zur Subshell-Lösung von @NPE finden Sie auch auf den folgenden
man
Seiten:Zusammengesetzte Befehle und Befehlssequenzen der Form 'a; b; c 'werden nicht ordnungsgemäß behandelt, wenn versucht wird, den Prozess auszusetzen. Wenn ein Prozess gestoppt wird, führt die Shell sofort den nächsten Befehl in der Sequenz aus. Es reicht aus, die Befehlsfolge in Klammern zu setzen, um sie in eine Unterschale zu zwingen, die als Einheit gestoppt werden kann.
Der richtige Begriff für STRG + Z ist das Suspend- Zeichen, wieder von den
man
Seiten:Wenn Sie das Suspend-Zeichen (normalerweise ^ Z, Control-Z) eingeben, während ein Prozess ausgeführt wird, wird dieser Prozess gestoppt und die Steuerung an bash zurückgegeben.
(Tut mir leid, die
man
Seiten so oft zu zitieren , aber sie sind wirklich deine Freunde und lesenswert)Wenn Sie sich das ansehen, werden
stty -a
Sie so etwas sehen:Sie können es also ändern, daher der Ausdruck "typisch". Tun Sie das aber nicht, es wird jeden verwirren. Der Terminaltreiber löst ein SIGTSTP-Signal aus, das von Bash abgefangen wird.
quelle
&&
verbindet zwei Pipelines , und jede Pipeline ist ein separater Job. (Beachten Sie, dass es sich bei der Pipeline um einen oder mehrere Befehle handelt|
, die durch a verbunden sind. Dies bedeutet, dasscommand1
es sich technisch gesehen um eine einzelne Pipeline mit einem Befehl handelt.)