GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi le script Bash ne se ferme-t-il pas après l'exécution ?

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.


Linux
  1. La différence entre les opérateurs bash [[ Vs [ Vs ( Vs ((?

  2. Pourquoi le script Bash ne reconnaît-il pas les alias ?

  3. Pourquoi le ~/.bash_profile ne fonctionne-t-il pas ?

  4. Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

  5. Pourquoi ne puis-je pas utiliser Cd dans un script Bash ? ?

Comment arrêter le script Loop Bash dans le terminal ?

Option Rsync inconnue à partir de l'exécution du script Bash ?

Bash + Comment quitter le script secondaire et le script principal à chaque fois ?

Comment obtenir le statut de sortie d'une boucle dans bash

Exécuter le script bash après la connexion

Que fait le -e dans un bash shebang ?