Tout d'abord, une fois que vous avez lancé un processus, vous pouvez le mettre en arrière-plan en l'arrêtant d'abord (appuyez sur Ctrl-Z) et ensuite en tapant bg
pour le laisser reprendre en arrière-plan. C'est maintenant un “job”, et ses stdout
/stderr
/stdin
sont toujours connectés à votre terminal. Vous pouvez lancer un processus en arrière-plan immédiatement en ajoutant un “&” à la fin de celui-ci :
firefox &
Pour le lancer en arrière-plan en silence, utilisez ceci :
firefox </dev/null &>/dev/null &
Quelques informations supplémentaires :
nohup
est un programme que vous pouvez utiliser pour exécuter votre application avec de sorte que son stdout/stderr puisse être envoyé dans un fichier à la place et de sorte que la fermeture du script parent ne SIGNIFIE pas l'enfant. Cependant, vous devez avoir eu la prévoyance de l'utiliser avant de lancer l'application. En raison de la façon dont nohup
fonctionne, vous ne pouvez pas simplement l'appliquer à un processus en cours.
disown
est un module de bash qui supprime un travail du shell de la liste des tâches du shell. Cela signifie essentiellement que vous ne pouvez plus utiliser fg
, bg
dessus, mais plus important encore, lorsque vous fermez votre shell, il ne sera plus suspendu ou n'enverra plus un SIGHUP
à cet enfant. Contrairement à nohup
, disown
est utilisé après que le processus ait été lancé et mis en arrière-plan.
Ce que vous ne pouvez pas faire, c'est changer le stdout/stderr/stdin d'un processus après l'avoir lancé. Du moins pas depuis le shell. Si vous lancez votre processus et lui dites que sa sortie standard est votre terminal (ce que vous faites par défaut), alors ce processus est configuré pour sortir sur votre terminal. Votre shell n'a rien à faire avec la configuration FD des processus, c'est purement quelque chose que le processus lui-même gère. Le processus lui-même peut décider de fermer ou non sa stdout/stderr/stdin, mais vous ne pouvez pas utiliser votre shell pour le forcer à le faire.
Pour gérer la sortie d'un processus en arrière-plan, vous avez de nombreuses options de scripts, “nohup” étant probablement le premier à venir à l'esprit. Mais pour les processus interactifs, vous commencez mais vous avez oublié de vous taire (firefox < /dev/null &>/dev/null &
), vous ne pouvez pas faire grand-chose, vraiment.
Je vous recommande d'utiliser GNU screen
. Avec l'écran, vous pouvez juste fermer votre shell en cours d'exécution lorsque la sortie du processus devient gênante et en ouvrir un nouveau (^Ac
).
Oh, et au fait, n'utilisez pas “$@
” là où vous l'utilisez.
$@
signifie, $1
, $2
, $3
…, ce qui transformerait votre commande en :
gnome-terminal -e "vim $1" "$2" "$3" ...
Ce n'est probablement pas ce que vous voulez parce que -e ne prend qu'un un argument. Utilisez $1
pour montrer que votre script ne peut gérer qu'un seul argument.
Il est vraiment difficile de faire fonctionner correctement plusieurs arguments dans le scénario que vous avez donné (avec le gnome-terminal -e
) parce que -e
ne prend qu'un seul argument, qui est une chaîne de commande shell. Vous devez encoder vos arguments en un seul. La meilleure et la plus robuste, mais plutôt maladroite, façon est comme ça :
gnome-terminal -e "vim $(printf "%q " "$@")"