Wie zu beheben (kurze Version)
Sie haben mehrere Möglichkeiten, dies zu tun:
Mit werden
%-
Sie aufgefordert, den letzten Hintergrundjob zu deaktivieren .xterm &> /dev/null & disown %-
Mit
$!
stattdessen fragen Sie den letzten enteignen ausgeführt Job (durch seine PID).xterm &> /dev/null & disown $!
Es wird also erforderlich sein, ein paar Zeichen mehr zu schreiben, aber Sie können zumindest auswählen, welche der folgenden Charaktere :-)
Die Gründe
Der Grund ist alles hier: Wenn Sie einen Job ausführen, der ihn in den Hintergrund sendet &
, ändert er im Wesentlichen nicht den aktuellen Job, sondern nur den vorherigen. Der aktuelle Job bleibt der zuvor.
Einige Wörter mehr und ein Beispiel
Sie können mit dem Befehl überprüfen, ob der Befehl oben jobs
und danach ausgegeben wurde, um einen Job im Hintergrund zu starten.
Vorher : Angenommen, Sie haben einige Hintergrundprozesse, die gerade von einem Terminal aus ausgeführt werden (z. B. mit
dolphin &
und gestartetkate &
).
Jetzt fängst du anvim
und suspendierst es mit Ctrl-Z.
Die Ausgabe vonjobs
wird sein:[1] Running dolphin . & [2]- Running kate & [3]+ Stopped vim
vim
ist der aktuelle Job, gekennzeichnet mit a+
, undkate
der vorherige, markiert mit a-
.Tatsächlich wird im bash-Referenzhandbuch in Kapitel 7.1 [ 1 ] erklärt: "In der Ausgabe, die sich auf Jobs bezieht
(z. B. die Ausgabe des Jobs-Befehls), wird der aktuelle Job immer mit einem '+' und der vorherige Job mit einem gekennzeichnet '-'. "Nachher : Zum Schluss schreibst du deinen Befehl
xterm &> /dev/null &
(ohnedisown
).Wenn Sie darum bitten,
jobs
wird es diesmal antworten:[1] Running dolphin . [2] Running kate [3]+ Stopped vim [4]- Running xterm &> /dev/null &
Beachten Sie, dass
vim
noch mit a+
undxterm
mit a gekennzeichnet ist-
.
Der letzte Hintergrundjob, der mit markiert-
ist, istxterm
und nicht mehrkate &
.Das System verhält sich also so, als ob
- Zuerst wird es ausgeführt
xterm
: Der neue Befehl (xterm
) wird zum aktuellen undvim
zum vorherigen. - Dann
xterm
wird im Hintergrund gesendet und die Steuerung kehrt zum vorherigen in der Liste zurück (vim
mit Status), der wieder zum aktuellen wird und mit erneut markiert wird+
.xterm
Stattdessen ist der neue vorherige Job und mit einem gekennzeichnet-
. - Am Ende finden Sie nur den vorherigen Job (-) und nicht den aktuellen (+) aktualisiert .
- Zuerst wird es ausgeführt
Da Sie anrufen können, disown
gefolgt von einer Jobnummer oder einer PID, haben Sie die beiden Varianten
%-
: Auf den vorherigen Job kann mit verwiesen werden%-
, möglicherweise einfacher zu merken, wenn Sie der Meinung sind, dass auch in Jobs ein gekennzeichnet ist-
$!
: Die PID des letzten Jobs, der im Hintergrund ausgeführt wird, befindet sich im speziellen Parameter [ 2 ] .$!
Der Befehl disown
akzeptiert beide.
Verweise