web-dev-qa-db-fra.com

Comment vérifier quel terminal j'utilise?

Ubuntu est installé sur ma machine et j'utilise un gestionnaire de fenêtres impressionnant. Comment puis-je vérifier quel terminal je tourne? Y at-il une commande pour cela?

21
user4943481

TL; DR

  • pour trouver Shell en cours d'utilisation, utilisez ls -l /proc/$$/exe
  • pour trouver le terminal en cours d'exécution, utilisez xprop _NET_WM_PID WM_CLASS. La valeur de pidlater peut être transmise à la commande ps -p <pid> -o args.
  • Techniquement, pour l'émulateur de terminal, vous n'avez même pas besoin d'une commande, comme indiqué dans le commentaires :

    que voulez-vous dire par quoi? Cliquez sur Aide -> À propos c'est ça? - JoKeR

Shell vs Terminal

La première chose à clarifier est de savoir exactement ce qui est demandé: recherchez le shell ou le terminal en cours d'exécution. Souvent, ces deux termes sont utilisés de manière interchangeable, mais ce sont des choses totalement différentes. Shell est l'interpréteur de ligne de commande, en particulier interactif. Shell est le champ de texte Invite plus dans lequel 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, terminal est l'interface avec Shell (bien que cela puisse également être une autre application). A l'origine, le terminal faisait référence au matériel réel, mais de nos jours ce sont surtout des logiciels. Ce que vous voyez lorsque vous appuyez sur Ctrl+Alt+t ou cliquez sur l'icône de terminal dans l'interface graphique, qui démarre un émulateur de terminal, une fenêtre imitant 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, à savoir ttyname__. Je recommande la lecture Pourquoi un terminal virtuel est-il "virtuel", et quoi/pourquoi/où est le "vrai" terminal? pour plus d'informations sur les détails.

Obtenir les informations sur le shell

Chaque utilisateur se voit attribuer un shell par défaut dans /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:

echo $Shell

Mais bien sûr, cela montre seulement la valeur par défaut . Supposons que nous fassions ce qui suit:

user@ubuntu:~$ dash
$

Nous étions à l'origine dans bashname__, mais nous avons lancé une session interactive du /bin/dash, POSIX ou Shell système d'Ubunt . La variable $Shell ne changera pas, car ce n'est pas son objectif - elle indique la valeur par défaut, pas la valeur actuelle. Nous devrons aborder cette question sous un autre angle - celui d'un processus, que j'ai déjà décrit dans Suis-je en train d'utiliser bash ou sh?

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

Ici, nous tirons parti du système de fichiers /proc/. 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 de Shell, ce que fait $$. Dans l'exemple ci-dessus, j'ajoute cela séparément, mais rien ne nous empêche de faire simplement

cat /proc/$$/comm

Des variations sur le thème pourraient aussi être

ps -p $$ -o args

Une autre façon de procéder consiste à vérifier où /proc/<pid>/exe. Ce fichier est un lien symbolique qui pointe vers le fichier exécutable. Ainsi on peut faire

user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1255/exe -> /bin/dash

Chacune des deux approches fonctionne dans 99% des cas. Bien sûr, il y a des façons de les subvertir. Par exemple, symlink ne pointera nulle part si l'exécutable a été supprimé peu de temps après le démarrage du shell (et dans ce cas, vous rencontrerez probablement des problèmes système, car la suppression de /bin/sh, /bin/dash ou même de /bin/bash n'est pas recommandée - après tout beaucoup de scripts compter sur eux, en particulier au niveau système). Le nom de la commande pour Shell est généralement défini comme le tout premier argument de execve() syscall. Ceci est couvert dans Comment bash sait-il comment il est invoqué? , donc si vous avez une application qui lance un Shell via execve(), elle pourrait lui attribuer un 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 étant xtermname __- compatible, signalé par echo $TERM ou echo $COLORTERM. Mais alors les variables d'environnement ne sont pas des outils très fiables. Ils peuvent être définis et désactivés. Nous pouvons faire la même chose avec les PID, sauf que cette fois-ci, nous examinerons le PID parent. Comme vous vous en souvenez peut-être, terminal est l'interface avec le shell et démarre souvent lui-même. Par conséquent, nous pouvons savoir quel processus est le processus parent de notre Shell:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
bash                         1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server

Essayons avec une autre application de terminal, sakuraname__:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
/bin/bash                   16950
$ ps -p 16950 -o args
COMMAND
sakura

À partir de là, nous pouvons déjà voir que ce qui a démarré ce shell est gnome-terminal. Bien sûr, cette méthode fonctionne en supposant que vous travaillez avec Shell interactif. Si nous essayons de trouver le parent de bash -c '...' ou le shell démarré via sshname__, par exemple, le PID peut très bien provenir d'une application non-terminale et peut-être même d'une interface graphique.

Donc, si nous voulons traiter spécifiquement avec le terminal graphique, nous pouvons exécuter xpropname__, cliquer sur la fenêtre désirée, grep son pid et trouver le nom du processus correspondant à ce pid. Ou en d'autres termes:

$ ps aux | grep $(xprop | awk -F'='  '/PID/ {print $2}')                       
xieerqi   2124  0.6  1.7 208068 34604 ?        Sl   18:47   1:49 gnome-terminal

En outre, comme selon les spécifications , les gestionnaires de fenêtres doivent définir la propriété WM_CLASS. Ainsi, nous pouvons obtenir cela à partir de xpropname__:

$ xprop WM_CLASS 
WM_CLASS(STRING) = "sakura", "Sakura"

Bien sûr, cela présente également 1% d'inconvénients: la définition de 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 été créé pour 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 devrions donc pas nous attendre à des problèmes avec quelque chose comme Gnome Terminal ou Terminator.

Mais lorsqu'il s'agit d'émulateurs de terminaux à interface graphique, nous n'avons même pas besoin de trouver une commande. Nous pouvons simplement utiliser le dialogue Aboutde la fenêtre elle-même. L’exception à cette règle est xtermname__.

20

La version courte (merci @ Serg )

cat /etc/alternatives/x-terminal-emulator

La version longue

Sudo update-alternatives --config x-terminal-emulator

et cherchez le * dans le résultat

;)


Exemple de résultat

There are 7 alternatives which provide `x-terminal-emulator’.
Variante de sélection 
 ———————————————— 
 1 /usr/bin/xterm
 2 /usr/bin/uxterm
 3 /usr/bin/koi8rxterm
 4 /usr/bin/lxterm
 * + 5 /usr/bin/gnome-terminal.wrapper
 6 /usr/bin/konsole
 7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:

Ou, grâce à @ mur , voici une sortie plus détaillée

$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
  link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.
12
A.B.

Si vous voulez connaître le programme de terminal que vous utilisez, utilisez ceci:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

Exécutez cette opération juste après avoir ouvert le terminal (Shell) sans passer à autre instance de Shell.

Lorsque vous ouvrez le programme terminal, il génère un programme enfant, un shell. Ainsi, le parent du shell engendré est 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) par ps -o 'ppid=' -p $$, qui sera l'ID de processus du programme de terminal.

Ensuite, nous trouvons le nom du processus à partir du PID:

$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal

C'est fondamentalement une ligne de:

$ ps -o 'ppid=' -p $$
 2268

$ ps -o 'cmd=' -p 2268
gnome-terminal
9
heemayl

Saisissez printenv à partir de la fenêtre du terminal pour afficher toutes les variables de la session ouverte.

Saisissez echo $COLORTERM à partir de la fenêtre du terminal. NOTE: cela ne fonctionne pas avec tous les terminaux, un comme sakura ne le rapporte pas.

root@terrance-Linux:~# echo $COLORTERM
gnome-terminal

celui ci-dessous provient d’un terminal aterm.

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
3
Terrance

Si vous souhaitez simplement connaître le nom du programme du terminal, vous le trouverez probablement dans Aide> À propos de.

3
thesdog
cat /etc/alternatives/x-terminal-emulator | grep exec

Exemple de sortie:

exec ('gnome-terminal', @ args);

Il y a la réponse pour mon système: gnome-terminal .

Donc, taper gnome-terminal dans mon terminal va maintenant ouvrir une autre fenêtre de terminal identique.

Sources:

0
Gabriel Staples