Empêcher bash d'afficher «Terminé» lorsqu'une commande en arrière-plan termine son exécution

34

Si j'exécute une commande en arrière-plan avec &, comme ceci:

sleep 2 &

lorsque la commande se termine, je reçois "Terminé". Comment puis-je éviter de voir le message "Terminé"?

Juan Pablo
la source

Réponses:

34

Exécutez la commande dans un sous-shell:

(sleep 2 &)
Wooble
la source
veuillez noter qu'en utilisant ceci, vous perdez le contrôle des travaux à l'intérieur du shell de l'appelant ( jobsne montrera rien).
mighq
36

Exécutez le shell intégré:

$ set +m

Cela fonctionne en désactivant le "mode moniteur" afin que le shell ne signale pas la fin des travaux en arrière-plan.

Bien que l'exécution de la commande dans un sous-shell comme:

$ (sleep 2&)

... désactivera également le message, la seule raison pour laquelle cela fonctionne est que le mode moniteur est activé par défaut uniquement pour les shells interactifs. Autrement dit, le sous-shell évite le message en exécutant un shell supplémentaire qui a un "set + m" automatique .

DigitalRoss
la source
4
Il faut noter que cette sortie n'est pas effectuée par le sommeil. C'est le shell bash qui vous informe simplement du travail d'arrière-plan terminé.
flolo
8

Je voudrais clarifier les deux réponses précédentes. Si ce que vous voulez, c'est de ne jamais voir le message Terminé à partir des commandes de votre shell, set +mc'est la voie à suivre. Mettez-le simplement dans votre .profile et / ou .bashrc et c'est fait. Notez cependant que si vous tapez ceci:

set +m
sleep 2 &
set -m

et le sommeil se termine après la finale set -m, vous aurez toujours le message terminé.

Si vous souhaitez désactiver le message pour un appel de commande unique, la technique de sous-shell (sleep 2 &)est la voie à suivre.

En toute honnêteté, je ne savais que set +m, donc +1 à Wooble pour m'avoir éclairé. Cependant, il convient de noter que celle des deux solutions que vous souhaitez dépend de ce que vous essayez de faire.

andrewdski
la source
0

Sans sous-shell , vous pouvez effectuer les opérations suivantes:

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

Basé sur cette réponse .

Tom Hale
la source