1
votes

Script bash - déterminer si le script est lancé dans la console du terminal ou dans l'interface graphique

Comment savoir si le script a été lancé en utilisant la console du terminal ou sans, en gui par fichier .desktop par exemple?

J'ai regardé la sortie env et certaines variables semblent prometteuses à vérifier, comme test $ TERM var. Mais je veux savoir avec certitude et un moyen compatible / portable de le faire.

Ceci est nécessaire pour le script qui aura deux comportements pour l'entrée utilisateur, le repli sur la lecture du terminal ou l'entrée de l'interface graphique.


5 commentaires

Vous n'êtes pas sûr de votre système d'exploitation et de votre environnement, mais essayez de vérifier votre "identifiant de processus parent" par rapport à la sortie de ps -aef pour voir par qui vous avez été lancé. Dans bash, vous pouvez faire echo $PPID


@MarkSetchell J'utilise ubuntu à la cannelle, mais je veux rendre le script portable


Eh bien, essayez-le et voyez. Cela ne devrait pas prendre plus de 50 secondes ;-)


Ok, je vois / bin / bash :)


@MarkSetchell Et si / bin / bash est un lien symbolique vers un tiret par exemple? La vérification de bash dans la sortie ps échouera.


3 Réponses :


3
votes
if [ -t 0 ]; then echo "in a terminal"; fi
That tests file descriptor 0, which is stdin. If you're launching your script as a GUI, that test should be false.Author: glenn jackman
  This won't work if the script is run from a terminal, but with input
  redirected. – Gordon Davisson
  
  so for the purpose of this discussion, terminal emulator is being
  conflated with linux console, and both are being distinguished from a
  "gui method" which I'd thought xterm to be, as it opens in a gui... -
  JosephHarriott
Purpose of this question was writing script interface usable for text or gui if script run by .desktop shortcut or other gui method.

6 commentaires

Cela ne fonctionnera pas si le script est exécuté à partir d'un terminal, mais avec l'entrée redirigée.


C'est bien avec mes exigences pour mon script (d'où il vient du site de révision de code), mais j'ajouterai votre commentaire pour répondre. Si vous avez une meilleure solution, allez-y, ajoutez une réponse.


Pour moi, dans Arch Linux , [ -t 0 ] est true dans la linux console . Donc, ce test échoue.


@JosephHarriott il doit être true dans la linux console , et faux si le script est exécuté par .desktop raccourci .desktop ou une autre méthode d'interface graphique


Ah, donc pour les besoins de cette discussion, l' émulateur de terminal est en train d'être confondu avec la console Linux , et les deux sont distingués d'une "méthode gui" que je pensais être xterm , car elle s'ouvre dans une interface graphique ...


@JosephHarriott C'est vrai. La console Linux fournit plusieurs terminaux virtuels et xterm est un émulateur de terminal. Le but de cette question était d'écrire une interface de script utilisable pour le texte ou l'interface graphique.



0
votes

Ou:

 $ [ -t 0 ] &&  echo "in a terminal" || echo "something else"
 in a terminal 


0 commentaires

1
votes

La réponse de @LeonidMew est incomplète et quelque peu incorrecte.

Vous ne devez pas détecter l'interface graphique en présence de STDIN (c'est ce que fait [-t 0] test). Il y a des cas où aucun des STDIN et GUI n'est disponible, par exemple lorsque vous exécutez le script sur une session ssh en mode non interactif. Cela se produit souvent pour les déploiements CI.

La bonne réponse dépend fortement de votre tâche, en général, il existe 4 environnements distincts:

  1. L'application est exécutée de manière non interactive, par exemple à partir de la commande ssh, générée en tant que processus enfant sans STDIO attaché, etc. L' GUI is missing, STDIN is missing .
  2. L'application est exécutée de manière interactive à partir de X-session avec un fichier .desktop ou similaire. GUI is present, STDIN is missing .
  3. L'application est exécutée de manière interactive à partir du terminal Linux (ssh, console de texte nu, console de récupération d'hébergement, etc.). GUI is missing, STDIN is present . L'application peut interagir avec l'utilisateur en mode texte via STDIN.
  4. L'application est exécutée de manière interactive à partir de l'application de terminal GUI, comme xterm. GUI is present, STDIN is present .

Il existe 2 tests de base qui peuvent aider à identifier l'environnement:

  1. Test GUI - si l'application peut interagir avec l'utilisateur à l'aide de fenêtres graphiques: testez la $DISPLAY env variable environnement $DISPLAY env variable .
  2. Test STDIN - si l'application peut interagir avec l'utilisateur à l'aide de la console texte: testez le descripteur de fichier 0 (aka STDIN) avec if [ -t 0 ]; ...

La combinaison de ces deux tests vous donnera l'environnement:

test 1 false + test 2 false: case 1 -- no user interaction available
test 1  true + test 2 false: case 2 -- interact via XWindows
test 1 false + test 2  true: case 3 -- interact via STDIN/console
test 1  true + test 2  true: case 4 -- XWindows or STDIN/console, whichever is preferred


1 commentaires

Bien que ma réponse soit adaptée à mon script, j'accepte votre réponse car elle est plus utile dans diverses situations.