Verhindern, dass Bash "Done" anzeigt, wenn ein Hintergrundbefehl ausgeführt wird

34

Wenn ich im Hintergrund einen Befehl mit dem folgenden Befehl ausführe &:

sleep 2 &

Wenn der Befehl beendet ist, erhalte ich "Fertig". Wie kann ich verhindern, dass die Meldung "Fertig" angezeigt wird?

Juan Pablo
quelle

Antworten:

34

Führen Sie den Befehl in einer Subshell aus:

(sleep 2 &)
Wooble
quelle
Beachten Sie, dass Sie dadurch die Kontrolle über die Jobs in der Anrufer-Shell verlieren (es jobswird nichts angezeigt).
6.
36

Führen Sie die integrierte Shell aus:

$ set +m

Dies funktioniert, indem der "Monitor-Modus" deaktiviert wird, sodass die Shell nicht meldet, dass Hintergrundjobs beendet werden.

Obwohl der Befehl in einer Subshell ausgeführt wird, wie:

$ (sleep 2&)

... wird auch die Meldung deaktivieren, der einzige Grund , warum es funktioniert , ist , weil Monitormodus standardmäßig für interaktiven Shells nur aktiviert ist. Das heißt, die Subshell vermeidet die Meldung, indem sie eine zusätzliche Shell mit einem automatischen "set + m" ausführt .

DigitalRoss
quelle
4
Man sollte beachten, dass diese Ausgabe nicht vom Schlaf ausgeführt wird. Es ist die Bash-Shell, die Sie nur über den abgeschlossenen Hintergrundjob informiert.
Flolo
8

Ich möchte die beiden früheren Antworten klarstellen. Wenn Sie niemals die Meldung "Fertig" von Befehlen in Ihrer Shell sehen möchten, ist dies der richtige set +mWeg. Einfach in Ihr .profile und / oder .bashrc einfügen und fertig. Beachten Sie jedoch Folgendes, wenn Sie Folgendes eingeben:

set +m
sleep 2 &
set -m

und der Schlaf endet nach dem Finale set -m, Sie werden immer noch die erledigte Nachricht erhalten.

Wenn Sie die Nachricht für einen einzelnen Befehlsaufruf deaktivieren möchten, ist die Subshell-Technik die richtige Wahl (sleep 2 &).

set +mEhrlich gesagt wusste ich nur Bescheid , also +1 an Wooble, um mich aufzuklären. Beachten Sie jedoch, dass die von Ihnen gewünschte Lösung von dem abhängt, was Sie versuchen.

andrewdski
quelle
0

Ohne eine Subshell können Sie Folgendes tun:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>-
    disown &>/dev/null  # Close STD{OUT,ERR} for silence if job has already completed
}

silent_background sleep 5

Basierend auf dieser Antwort .

Tom Hale
quelle