it-swarm.com.de

Führe einen Befehl nach dem anderen aus, auch wenn ich den ersten aussetze (Strg-z)

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 möchte, dass command2 Nur ausgeführt wird, wenn command1 Erfolgreich ist, indem ich && Verwende:

$ command1 && command2

Dies funktioniert, aber wenn ich command1 Mit Ctrl-z Aussetze, wird command2 Im ersten Fall sofort ausgeführt und im zweiten Fall überhaupt nicht . Wie kann ich Befehle nacheinander ausführen, aber den ersten Befehl trotzdem anhalten, aber den zweiten nicht ausführen lassen, bis ich ihn neu gestartet habe (mit fg) und er beendet ist? Ich würde etwas bevorzugen, das so einfach wie möglich zu tippen ist, da ich dies interaktiv tun möchte. Oder vielleicht muss ich einfach irgendwo eine Option einstellen.

Übrigens, was ist der richtige Begriff für das, was Ctrl-z Tut?

66
asmeurer

Folgendes sollte es tun:

(command1; command2)

Beachten Sie die hinzugefügten Klammern.

90
NPE

Wenn Sie in Bash einen Job in den Hintergrund stellen (STRG + Z oder &), wartet er nicht auf den Abschluss des Jobs und gibt einen Beendigungscode von Null (Erfolg) aus. So viel haben Sie beobachtet und es ist auf den man Seiten dokumentiert.

Das Verhalten des logischen "UND" && ist, dass von links nach rechts geprüft wird. Jeder Teil muss erfolgreich sein. Wenn der erste 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.

Die Erklärung der Subshell-Lösung von @NPE finden Sie auch auf den Seiten man:

Zusammengesetzte Befehle und Befehlssequenzen der Form 'a; b; c' werden beim Versuch der Prozessunterbrechung nicht ordnungsgemäß behandelt. Wenn ein Prozess gestoppt wird, führt die Shell sofort den nächsten Befehl in der Sequenz aus. Es genügt, ihn zu platzieren Die Folge von Befehlen in Klammern, um die Umwandlung in eine Unterschale zu erzwingen, die als Einheit angehalten werden kann.

Der richtige Ausdruck für STRG + Z ist das Anhalten Zeichen, ebenfalls von den man Seiten:

Wenn Sie das Suspend-Zeichen (normalerweise ^ Z, Strg-Z) eingeben, während ein Prozess ausgeführt wird, wird dieser Prozess angehalten und die Steuerung wird an bash zurückgegeben.

(Tut mir leid, dass ich die man Seiten so oft zitiere, aber sie sind wirklich deine Freunde und lesenswert.)

Wenn Sie sich stty -a Sie werden so etwas sehen:

susp = ^Z; 

Sie können es also ändern, daher der Ausdruck "typisch". Tu das aber nicht, es wird jeden verwirren. Der Terminal-Treiber löst ein SIGTSTP-Signal aus, das von Bash abgefangen wird.

11
cdarke