J'ai Ubuntu sur ma machine et j'exécute un gestionnaire de fenêtres génial en plus. Comment vérifier quel terminal j'utilise? Y a-t-il une commande pour cela?
command-line
gnome-terminal
user4943481
la source
la source
Réponses:
TL; DR
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. La valeur depid
later peut être transmise àps -p <pid> -o args
command.Techniquement, pour l'émulateur de terminal, vous n'avez même pas besoin d'une commande, comme indiqué dans les commentaires :
Shell vs Terminal
La première chose que nous devons clarifier est ce qui est exactement demandé - découvrez le shell en cours d'exécution ou le terminal en cours d'exécution. Souvent, ces deux termes sont utilisés de manière interchangeable, mais ce sont des choses complètement différentes. Shell est l'interpréteur de ligne de commande, spécifiquement le shell interactif est le champ de texte d'invite plus où vous entrez des commandes. Les shells peuvent également être non interactifs, par exemple un script démarre un shell non interactif, ou
bash -c 'echo hello world'
démarre également un shell non interactif.En revanche, le terminal est l'interface avec le shell (bien qu'il puisse également s'agir d'une autre application). À l'origine, le terminal faisait référence au matériel réel, mais de nos jours, il s'agit principalement de logiciels. Ce que vous voyez lorsque vous appuyez sur Ctrl+ Alt+ tou cliquez sur l'icône du terminal dans l'interface graphique, qui démarre un émulateur de terminal, une fenêtre qui imite le comportement du matériel, et dans cette fenêtre, vous pouvez voir le shell en cours d'exécution. Ctrl+ Alt+ F2(ou l'une des 6 touches de fonction) ouvrira la console virtuelle, alias
tty
. Je recommande de lire Pourquoi un terminal virtuel est-il «virtuel», et quel / pourquoi / où est le «vrai» terminal? pour plus d'informations sur les spécificités.Obtention des informations sur le shell
Chaque utilisateur se voit attribuer un shell par défaut
/etc/passwd
pour son nom d'utilisateur. En supposant que vous utilisez la configuration par défaut et que vous n'avez pas appelé explicitement un autre shell en tant que commande, il suffit de faire:Mais bien sûr, cela ne montre que la valeur par défaut . Supposons que nous procédions comme suit:
Nous étions à l' origine dans
bash
, mais il a commencé session interactive de/bin/dash
, Posix ou shell système d'Ubuntu . La variable$SHELL
ne changera pas, car ce n'est pas son objectif - elle affiche la valeur par défaut et non actuelle. Nous devrons aborder cette question dans une autre perspective - la perspective d'un processus, qui est quelque chose que j'ai couvert dans Suis-je en utilisant bash ou sh?Ici, nous profitons du
/proc/
système de fichiers. Le nom du processus et les paramètres de ligne de commande sont affichés dans/proc/<pid>/comm
. Tout ce dont nous avons besoin est de fournir le PID du shell, ce qui est le$$
cas. Dans l'exemple ci-dessus, j'ajoute cela séparément, mais rien ne nous empêche de faire justeUne variation sur le thème pourrait également être
Une autre façon de procéder est de vérifier où
/proc/<pid>/exe
. Ce fichier est un lien symbolique qui pointe vers le fichier exécutable. Ainsi nous pouvons faireL'une ou l'autre des deux approches fonctionne dans 99% des cas. Bien sûr, il existe des moyens de les renverser. Par exemple, symlink ne pointera nulle part si l'exécutable a été supprimé peu de temps après la coquille a commencé (et dans ce cas , vous aurez probablement rencontrer des problèmes de système, depuis la suppression
/bin/sh
,/bin/dash
ou même/bin/bash
n'est pas recommandé - après tout beaucoup de scripts comptent sur eux , en particulier au niveau du système). Le nom de commande du shell est généralement défini comme le tout premier argument dansexecve()
syscall. Ceci est traité dans Comment bash sait-il comment il est appelé? , donc si vous avez une application qui lance un shell viaexecve()
, elle pourrait lui donner n'importe quel nom. Mais ce sont des choses non standard et non typiques, qui devraient être évitées pour des raisons de cohérence et de sécurité.Obtenir des informations sur le terminal
Nous pouvons commencer avec les variables d'environnement. De nombreux terminaux semblent se masquer comme
xterm
compatibles, ce qui est signalé parecho $TERM
ouecho $COLORTERM
. Mais alors les variables d'environnement ne sont pas un outil très fiable. Ils peuvent être activés et désactivés. Nous pouvons à nouveau faire la même chose avec les PID, sauf que cette fois, nous allons examiner le PID parent. Comme vous vous en souvenez peut-être, le terminal est l'interface avec le shell et démarre souvent le shell lui-même. Par conséquent, nous pouvons découvrir quel processus est le processus parent de notre shell:Essayons avec une autre application de terminal
sakura
:De là, nous pouvons déjà voir que ce qui a commencé cet obus est
gnome-terminal
. Cette méthode fonctionne bien sûr en supposant que vous travaillez avec un shell interactif. Si nous essayons de découvrir le parent debash -c '...'
ou le shell démarré viassh
, par exemple, le PID peut très bien provenir d'une application non terminale et peut-être pas du tout GUI.Donc, si nous voulons traiter spécifiquement du terminal GUI, ce que nous pouvons faire est d'exécuter
xprop
, cliquez sur la fenêtre souhaitée, grep son pid et découvrez quel est le nom de ce processus correspondant au pid. Ou en d'autres termes:En outre, conformément aux spécifications , les gestionnaires de fenêtres doivent définir la
WM_CLASS
propriété. Ainsi, nous pouvons également obtenir celaxprop
:Bien sûr, cela a aussi ses 1% d'inconvénients: la définition des
WM_CLASS
propriétés dépend du gestionnaire de fenêtres, et le PID n'est pas garanti pour qu'une fenêtre soit précise (voir Quel processus a créé cette fenêtre X11? ), Ce qui peut impliquer un débogage complexe. Et ce ne sont pas des défauts des méthodes elles-mêmes mais du serveur X11. Cependant, la plupart des gestionnaires de fenêtres stables et bien connus (comme openbox, Metacity, blackbox) et la plupart des applications se comportent bien, nous ne devons donc pas nous attendre à des problèmes avec quelque chose comme Gnome Terminal ou Terminator.Mais en ce qui concerne les émulateurs de terminaux GUI, nous n'avons même pas besoin de trouver une commande. Nous pouvons simplement utiliser la
About
boîte de dialogue de la fenêtre elle-même. Une exception à cette règle estxterm
.la source
$SHELL
, bien sûrps | grep
?ps -p $$
! Ou, juste pour la commande,ps -p $$ -o cmd=
.ps | grep
c'est juste une mauvaise forme. La plupart de ce que vous pouvez grep peut être obtenu parps
lui-même ou par d'autres outils.La version courte (thx @Serg )
La version longue
et recherchez le
*
dans la sortie;)
Exemple de sortie
Ou, grâce à @muru , voici une sortie plus détaillée
la source
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
ouupdate-alternatives: error: unknown argument
--config
sudo
. Utilisationupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
pour obtenir la cible de ce lien symbolique à la placecat
. L'file
utilitaire doit être installé sur la plupart des systèmes et peut être utilisé pour trouver l'exécutable cible.cat
sur le lien symbolique pourrait imprimer n'importe quel script shell ou même fichier binaire selon la cible de ce lien (script shell pourgnome-terminal
, fichier binaireurxvt
, etc.).Si vous voulez connaître le programme de terminal que vous utilisez, utilisez ceci:
Exécutez ceci juste après avoir ouvert le terminal (shell) sans bifurquer d'autre instance de shell .
Lorsque vous ouvrez le programme terminal, il génère essentiellement un programme enfant, un shell. Le parent du shell généré est donc le terminal lui-même. En d'autres termes, le PPID du shell est le PID du programme terminal.
Nous trouvons ici l'ID de processus parent (PPID) du shell (
bash
) parps -o 'ppid=' -p $$
, qui sera l'ID de processus du programme terminal.Ensuite, nous trouvons le nom du processus à partir du PID:
Il s'agit essentiellement d'une ligne de:
la source
sshd: username@pts/4
. Remarque J'utilise PuTTY pour me connecter à la machine. Est-cesshd
réellement l'émulateur de terminal?Tapez dans
printenv
la fenêtre du terminal pour afficher toutes les variables de la session ouverte.Tapez dans
echo $COLORTERM
la fenêtre du terminal. REMARQUE: cela ne fonctionne pas avec tous les terminaux, un commesakura
ne le signale pas.celui ci-dessous provient d'un
aterm
terminal.la source
Si vous voulez juste le nom du programme du terminal, vous le trouverez très probablement sous Aide> À propos.
la source
Exemple de sortie:
Il y a la réponse pour mon système: gnome-terminal .
Donc, taper
gnome-terminal
dans mon terminal ouvrira maintenant une autre fenêtre de terminal identique.Sources:
la source
Réponse simple. Fonctionne à la fois sur console ou ssh.
Exemple pour un terminal de caractères simple:
vous indique que vous ne pouvez pas ouvrir d'applications GUI sur cette connexion
Exemple pour xterm (fonctionne également avec PuTTY / Xming sous Windows)
signifie que vous pouvez utiliser des commandes GUI comme ouvrir l'éditeur Leafpad ou le gestionnaire de fichiers Nautilus.
Sur la console c'est pareil:
la source
TERM
n'est pas une variable qui définit l'émulateur de terminal par défaut, mais plutôt une qui définit les capacités de l'émulateur actuel. Par exemple, définir la variable sur "xterm-color" permet à tout programme en cours d'exécution dans le terminal de savoir que le terminal actuel est censé comprendre les couleurs; le paramétrer sur "linux" indique aux programmes que c'est censé être un VT; etc.