web-dev-qa-db-fra.com

Comment faire en sorte que le script détecte si l'émulateur de terminal s'exécute dans une session de bureau ou non?

J'ai des scripts que j'exécute qui écrivent un fichier texte, puis l'ouvrent dans un éditeur. Si j'ouvre une fenêtre d'émulateur de terminal dans ma session de bureau et exécute le script, j'aimerais que l'éditeur soit graphique, tel que gedit. Mais, si je suis connecté via ConnectBot sur mon téléphone ou similaire (sans session de bureau), je voudrais que l'éditeur soit nano.

Actuellement, je dois maintenir 2 scripts différents, identiques à l'exception de la dernière étape (ou laisser le graphique s'exécuter, erreur désactivée, puis ouvrez manuellement le fichier dans nano). Avoir deux scripts essentiellement identiques est inefficace du point de vue de la maintenance.

Un script peut-il détecter la situation dans laquelle je me trouve et ouvrir l'éditeur approprié?

(J'ai trouvé un moyen pour un script de détecter s'il est exécuté dans une fenêtre d'émulateur de terminal ou en double-cliquant dessus, mais pas encore trouvé un moyen de détecter si la fenêtre est en cours d'exécution dans un bureau. connaître la terminologie correcte à utiliser pour Google)

10
Organic Marble

Vous pouvez utiliser la variable d'environnement $DISPLAY en tant que déclencheur dans une condition if. Habituellement, lorsque cette variable a une valeur, vous pouvez exécuter des applications graphiques.

Voici un exemple bash :

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

L'opérateur -z renverra true lorsque la variable d'environnement $DISPLAY sera vide et que votre script exécutera nano, dans tous les autres cas, gedit.


Selon le commentaire de @ vurp :

Sur la plupart des bureaux Wayland modernes (comme le bureau par défaut dans Fedora et Ubuntu), $DISPLAY est toujours défini en raison de la compatibilité avec les versions antérieures (via XWayland), mais pour un script plus robuste, il serait bon de tester à la fois $DISPLAY et $WAYLAND_DISPLAY.

Je suggérerais de modifier l'expression de test de la manière suivante:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

Ainsi, les valeurs des deux variables seront concaténées dans une chaîne commune, qui sera traitée par l'opérateur -z.


Références:

13
pa4080

Les terminaux virtuels utilisent généralement /dev/pts pseudo-terminaux . Ainsi, en fonction du résultat de la commande tty, nous pouvons construire une simple instruction case pour gérer l’ouverture d’un éditeur particulier:

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

Ou formaté plus gentiment:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

Par rapport à l'utilisation de variables d'environnement, cette option est légèrement plus fiable et, dans la mesure où elle utilise l'instruction case avec la commande tty, elle est légèrement plus portable. Le mieux serait probablement de combiner les deux, avec des tests supplémentaires, tels que "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;

7

C'est ce que j'ai utilisé:

# $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

La raison de ce code était cette question: le raccourci sur le script Bash se bloque et se grave

Vous pouvez le modifier pour ressembler à ceci:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
3
WinEunuuchs2Unix