J'ai compilé une courte ligne bash pour concentrer une application en cours d'exécution ou la lancer si elle ne s'exécute pas :
#!/bin/bash
#intellilaunch.sh
wmctrl -a $1 || $1 & disown
exit 1
La commande se termine parfaitement bien lorsqu'elle est exécutée directement depuis la ligne de commande :
:~$ wmctrl -a firefox || firefox & disown
[1] 32505
Une vérification rapide avec le moniteur système montre que seul Firefox est en cours d'exécution.
Cependant, lorsque je lance firefox via le script (./intellilaunch.sh firefox
) il génère un nouveau processus persistant appelé intellilaunch.sh firefox
, qui ne se ferme qu'après la fermeture de firefox.
Qu'est-ce que je fais de mal ?
Modifier :
J'ai modifié mon script selon la suggestion de michas :
#!/bin/bash
program=$(basename $1)
if ! wmctrl -a "$program"; then
"$1"&
fi
Ce n'est plus un one-liner mais ça marche parfaitement bien maintenant !
Réponse acceptée :
Je ne peux pas reproduire ce comportement sur mon système. D'après votre description, il semble qu'il y ait un processus qui n'est pas correctement défini en arrière-plan.
Essayez d'exécuter en tant que bash -x intellilaunch.sh xclock
, cela devrait montrer ce qui se passe.
Aussi ||
se lie plus fort que &
, donc vous envoyez tout le tuyau en arrière-plan. Peut-être un if
explicite serait une bonne idée.
Votre
wmctrl -a firefox || firefox & disown ; exit 1
est interprété comme
( wmctrl -a firefox || firefox ) & disown ; exit 1
alors que vous vouliez probablement dire
wmctrl -a firefox || ( firefox & disown ) ; exit 1
En raison de cela, bash démarrera deux travaux, l'un avec wmctl et firefox - et l'autre avec disown et exit. Comme le travail en arrière-plan a besoin d'un peu de temps pour se lancer, il démarrera probablement les commandes un peu plus tard, c'est pourquoi la sortie de bash -x
semble être dans le mauvais ordre.