Comment vérifier si le script a été exécuté via une ligne de commande ou un double-clic?

Comment puis-je déterminer si un script a été appelé à partir d’une ligne de commande ou via un double-clic dans le gestionnaire de fichiers (Nautilis)?

Si l’ancien, j’ai toujours une invite de commande lorsque le script est terminé, mais s’il a été double-cliqué (ou exécuté via un fichier .desktop), le script s’exécute dans une fenêtre puis disparaît. Je veux que la fenêtre rest ouverte avec une invite de commande.

Je suppose que le script pourrait effectuer cette vérification et ne rien faire – s’il est appelé à partir d’une ligne de commande – ou exec bash à la fin s’il est appelé via un double-clic ou un fichier .desktop.

N’a pas réussi à utiliser des méthodes pour vérifier si interactive ou pas ou tty.

Vous pouvez vérifier si le processus parent est le shell. Par exemple:

 #! /bin/bash if [[ $(readlink -f /proc/$(ps -o ppid:1= -p $$)/exe) != $(readlink -f "$SHELL") ]] then echo "Starting the shell..." exec "$SHELL" else echo "Not starting a shell." fi 

ps -o ppid:1= -p $$ le PID du processus parent ( ppid ) du processus en cours ( -p $$ ). Un readlink sur /proc//exe devrait afficher le chemin d’access à l’exécutable, qui serait le shell si vous l’exécutiez dans un shell ou autre chose.


Une autre possibilité est la variable SHLVL , qui indique le degré d’imbrication de l’instance actuelle du shell. S’il est exécuté dans un shell, le script doit avoir SHLVL 2 ou supérieur. Lorsqu’il est exécuté en double-cliquant ou à partir d’un programme de lancement de bureau, il doit correspondre à 1:

 #! /bin/bash if (( SHLVL > 1 )) then echo "Starting the shell..." exec "$SHELL" else echo "Not starting a shell." fi 

Vous pouvez vérifier si le script shell a été exécuté sur un terminal en analysant le résultat de la commande tty .

 #! /bin/bash if [[ $(tty) =~ "not a tty" ]] then echo "Not running on terminal" else echo "Running on terminal" fi 

J’ai vérifié les différences entre l’environnement lors de l’exécution d’un script depuis le terminal et l’environnement lors de l’exécution d’un script en double-cliquant dessus dans Fichiers;

Lorsque vous exécutez un script en double-cliquant sur Fichiers, la variable $VTE_VERSION n’est pas $VTE_VERSION . Vous pouvez donc vous y accrocher pour décider de remplacer ou non l’instance Bash actuelle par une instance interactive.

C’est-à-dire, mettez ceci à la fin de votre script:

 #! /bin/bash # ... [ ! -z $VTE_VERSION ] && exec bash 

Pour que cela fonctionne également si le script est exécuté à partir d’un fichier de bureau, modifiez la ligne Exec = du fichier de bureau à partir de say:

 Exec=/path/to/script 

À:

 Exec=sh -c '/path/to/script; exec bash' 

De cette façon, /path/to/script sera exécuté et sh sera remplacé par Bash à la fin du /path/to/script .

Lorsque vous double-cliquez sur Nautilus, vous ne disposez pas de la configuration complète de l’environnement, contrairement à une session de terminal classique. J’utilise ce code standard pour éviter les accidents: entrez la description du lien ici . Vous pouvez l’adapter à vos besoins:

 # $TERM variable may be missing when called via desktop shortcut CurrentTERM=$(env | grep TERM) if [[ $CurrentTERM == "" ]] ; then notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable." exit 1 fi