Wie zu beheben (kurze Version)
Sie haben mehrere Möglichkeiten, dies zu tun:
Mit %-
Sie werden darum bitten, den letzten zu verleugnen Hintergrundjob .
xterm &> /dev/null & disown %-
Mit $!
Stattdessen werden Sie darum bitten, das Letzte zu ignorieren ausgeführter Auftrag (über seine PID).
xterm &> /dev/null & disown $!
Es wird also einige Zeichen mehr erfordern, aber zumindest können Sie auswählen, welche :-)
Die Gründe
Der Grund ist alles hier: wenn Sie einen Auftrag ausführen, der mit in den Hintergrund gesendet wird &
Im Grunde ändert es nicht den aktuellen Job, sondern nur den vorherigen. Der aktuelle Job bleibt der vorherige.
Einige Worte mehr und ein Beispiel
Sie können überprüfen, was oben mit dem Befehl gesagt wurde jobs
Vergleichen der Ausgabe vor und nach dem Starten eines Jobs im Hintergrund.
Vor : Nehmen wir an, Sie haben ein paar Hintergrundprozesse, die nur von einem Terminal ausgeführt werden (z. B. gestartet mit dolphin &
und kate &
).
Jetzt fängst du an vim
und du setzt es aus mit Strg-Z .
Die Ausgabe von jobs
wird sein:
[1] Running dolphin . &
[2]- Running kate &
[3]+ Stopped vim
vim
ist der aktuelle Job, gekennzeichnet mit einem +
, und kate
ist die vorherige, gekennzeichnet mit einem -
.
In der Bash-Referenzanleitung, Kapitel 7.1 [ 1 ] wird das erklärt
"Bei Ausgaben, die sich auf Aufträge beziehen (z. B. die Ausgabe des Befehls" Aufträge "), wird der aktuelle Auftrag immer mit einem" + "und der vorherige Auftrag mit einem" - "gekennzeichnet."
Nach dem : Schließlich schreiben Sie Ihren Befehl xterm &> /dev/null &
(ohne disown
).
Fragen an jobs
Diesmal wird es antworten:
[1] Running dolphin .
[2] Running kate
[3]+ Stopped vim
[4]- Running xterm &> /dev/null &
Beachten Sie, dass vim
ist noch mit einem gekennzeichnet +
und xterm
mit einer -
.
Der letzte mit gekennzeichnete Hintergrundjob -
ist xterm
und nicht mehr kate &
.
Das System verhält sich also so, als ob
- Zuerst läuft es
xterm
: der neue Befehl ( xterm
) wird die aktuelle und vim
Der vorherige.
- Dann
xterm
wird im Hintergrund gesendet und die Steuerung kehrt zum vorherigen in der Liste zurück vim
mit seinem Status) wird das wieder der aktuelle und es wird wieder mit markiert +
. xterm
stattdessen ist das neue vorherige Arbeit und es ist mit einem gekennzeichnet -
.
- Am Ende findest du nur das aktualisierte vorherige Arbeit (-) und nicht der aktuelle (+).
Da kannst du anrufen disown
Nach einer Auftragsnummer oder einer PID haben Sie die beiden Varianten
%-
: Auf den vorherigen Job kann mit verwiesen werden %-
, vielleicht einfacher zu merken, wenn Sie denken, dass auch in Jobs mit einem gekennzeichnet ist -
$!
: Die PID des letzten Jobs, der im Hintergrund ausgeführt wird ist in dem speziellen Parameter $!
[ 2 ] .
Der Befehl disown
wird beides akzeptieren.
Verweise