web-dev-qa-db-fra.com

Situation de poulet et d'œufs: fonction pour les commandes en cours d'exécution en arrière-plan

Je crains que cela ne soit un duplicata, mais je ne pouvais pas trouver une question correspondante.

Je travaille surtout sur la ligne de commande. Si je veux simplement ouvrir un fichier PDF, je tiens à conserver ma commande de commande réelle et ne pas être inondée de toute sortie.

En général

evince my_file.pdf </dev/null &>/dev/null &

est-ce que le travail ... mais la frappe qui n'est pas très pratique. J'ai donc essayé d'ajouter une fonction:

function exec_in_background_silent() {
    "$@" </dev/null &>/dev/null &
}

Ce type de travail dans le but d'exécuter la commande passée détachée ... mais l'appelant comme ceci:

exec_in_background_silent evince my_file.pdf

Me fait perdre ma commande de commander, car je pense maintenant qu'il attend que la fonction elle-même ait fini :(

Cela fonctionne parfaitement bien, si j'ajoute une autre ampersand:

exec_in_background_silent evince my_file.pdf &

Mais: Y a-t-il un moyen de s'en débarrasser?

(Evince est peut-être un mauvais exemple, car ce n'est pas très bavard de toute façon ... mais il y en a d'autres;)))

édition pour plus de détails :

Je cours Ubuntu

echo "${BASH_VERSION}"
5.0.17(1)-release
  1. Après avoir appelé la ligne de commande est verrouillée
  2. En appuyant sur Entrée, obtenez-moi de nouvelles lignes vides
  3. Appuyez sur [strg]+[c] donne la sortie suivante et termine Evluence
exec_in_background_silent evince my_file.pdf
[1] 12234







^C
[1]+  Fertig                   < /dev/null &> /dev/null
1
evilive

Dans Manpage de Bash, il dit:

Lorsque Bash démarre un travail de manière asynchrone (en arrière-plan), il imprime une ligne qui ressemble à:

[1] 25647  

indiquant que ce travail est le numéro de travail 1 et que l'ID de processus du dernier processus de la pipeline associée à ce travail est 25647. Tous les processus d'un seul pipeline sont des membres du même travail. Bash utilise l'abstraction du travail comme base du contrôle des travaux.

Et @dimitire Radoulov a déclaré dans cet autre SO POST :

vous pouvez supprimer cette sortie en mettant l'appel dans un sous-vase:

(Echo "Bonjour je suis une tâche de fond" &)

Ainsi, afin d'éviter le numéro de travail et la ligne de sortie ID de processus, vous devez modifier votre fonction comme suit:

function exec_in_background_silent() {
    ("$@" </dev/null &>/dev/null &)
}
1
masterguru