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.
3 Réponses :
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.
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.
Ou:
$ [ -t 0 ] && echo "in a terminal" || echo "something else" in a terminal
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:
GUI is missing, STDIN is missing
.GUI is present, STDIN is missing
.GUI is missing, STDIN is present
. L'application peut interagir avec l'utilisateur en mode texte via STDIN.GUI is present, STDIN is present
.Il existe 2 tests de base qui peuvent aider à identifier l'environnement:
$DISPLAY env variable
environnement $DISPLAY env variable
.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
Bien que ma réponse soit adaptée à mon script, j'accepte votre réponse car elle est plus utile dans diverses situations.
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 faireecho $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.