Comment puis-je obtenir le nom du terminal actuel en ligne de commande?

23

Existe-t-il une possibilité d'obtenir le type de terminal avec une commande?

Si j'utilise gnome-terminal , le résultat devrait être gnome-terminal ou quelque chose de similaire. Il serait également intéressant d’obtenir la version du terminal.

Mettre à jour

ps -aux | grep 'ps -p $$ -o ppid=' 

affichera quelque chose comme ceci:

user     4239  0.0  0.7 292708 15744 pts/8    Sl   11:39   0:02 xfce4-terminal
user     4800  0.0  0.0   6176   820 pts/0    S+   12:23   0:00 grep --color=auto  4239

Cela fonctionnera également avec xterm, mais comment puis-je obtenir uniquement le nom ( xfce4-terminal dans ce cas)?

    
posée TuKsn 04.06.2014 - 11:51
la source

5 réponses

27

Version originale

Une façon de procéder consiste à obtenir le processus parent de votre session shell actuelle et à partir de là le nom du terminal.

  1. Obtenir le parent du processus shell en cours. La variable bash $$ est le PID de votre shell actuel. Nous pouvons donc donner cela sous forme de requête à ps ( -p $$ ) et lui demander d'imprimer le PID du processus parent ( -o ppid= , le dernier point= évite d’imprimer les en-têtes de colonnes):

    $ ps -p $$ -o ppid=
    544
    

    Ainsi, le PID du parent de mon shell est 544 .

  2. Obtenez le processus associé à ce PID et imprimez sa ligne de commande

    $ ps -p 544 o args=
    /usr/bin/python /usr/bin/terminator
    

    La sortie ci-dessus dépendra de l'émulateur de terminal que vous utilisez. J'utilise terminator .

  3. Tout combiner en une seule commande

    ps -p $(ps -p $$ -o ppid=) o args=
    
  4. Utilisez-le pour obtenir la version

    $(ps -p $(ps -p $$ -o ppid=) o args=) --version
    terminator 0.97
    
  5. Ajoutez une petite fonction à votre ~/.bashrc qui renvoie le nom et la version de l'émulateur de terminal que vous utilisez (cela fonctionne pour les émulateurs de terminal les plus courants):

    which_term(){
        term=$(ps -p $(ps -p $$ -o ppid=) -o args=);
        found=0;
        case $term in
            *gnome-terminal*)
                found=1
                echo "gnome-terminal " $(dpkg -l gnome-terminal | awk '/^ii/{print $3}')
                ;;
            *lxterminal*)
                found=1
                echo "lxterminal " $(dpkg -l lxterminal | awk '/^ii/{print $3}')
                ;;
            rxvt*)
                found=1
                echo "rxvt " $(dpkg -l rxvt | awk '/^ii/{print $3}')
                ;;
            ## Try and guess for any others
            *)
                for v in '-version' '--version' '-V' '-v'
                do
                    $term "$v" &>/dev/null && eval $term $v && found=1 && break
                done
                ;;
        esac
        ## If none of the version arguments worked, try and get the 
        ## package version
        [ $found -eq 0 ] && echo "$term " $(dpkg -l $term | awk '/^ii/{print $3}')    
    }
    

    Vous pouvez maintenant obtenir le nom du terminal et également transmettre l’option de votre choix (telle que --version .

Quelques exemples utilisant différents terminaux:

  1. xterm

    $ which_term
    XTerm(297)
    
  2. terminator

    $ which_term 
    terminator 0.97
    
  3. rxvt , celui-ci ne contient aucun des indicateurs -V , -version ou --version ; aucune information sur la version n'est donc imprimée.

    $  which_term
    rxvt  1:2.7.10-5
    
  4. gnome-terminal .

    $ which_term
    gnome-terminal  3.10.1-1
    
  5. konsole

    $ which_term
    Qt: 4.8.6
    KDE Development Platform: 4.11.3
    Konsole: 2.11.3
    
  6. lxterminal

    $ which_term
    lxterminal  0.1.11-4
    
  7. xfce4-terminal

    $ which_term
    xfce4-terminal 0.6.2 (Xfce 4.10)
    
    Copyright (c) 2003-2012
        The Xfce development team. All rights reserved.
    
    Written by Benedikt Meurer <[email protected]>
    and Nick Schermer <[email protected]>.
    
    Please report bugs to <http://bugzilla.xfce.org/>.
    

Nouveau et amélioré

L’approche ci-dessus n’est cependant pas digne de confiance. Il s'étouffera lorsque vous exécuterez votre shell après su ing avec un autre utilisateur ou lorsque votre terminal aura un alias avec quelque chose et divers autres cas. Puisque nous travaillons évidemment avec les programmes X ici, un meilleur moyen pourrait être d’utiliser quelque chose comme xdotool (installable avec sudo apt-get install xdotool ) pour obtenir les informations à la place:

perl -lpe 's/
$ which_term 
lxterminal 
/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline

Ce qui précède imprimera la ligne de commande utilisée pour lancer la fenêtre actuellement active. Puisque votre terminal sera probablement actif, c'est la commande qu'il affichera. Cela signifie que pour la plupart des émulateurs de terminal, vous pouvez sans risque supposer que le premier champ renvoyé est le nom du terminal:

$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4

Cela signifie que l’obtention de la version est triviale. Par exemple

$ which_term 
/usr/lib/gnome-terminal/gnome-terminal-server 

Pas le cas pour gnome-terminal :

$ which_term
/usr/bin/python /usr/bin/terminator 

ou terminator :

which_term(){
    term=$(perl -lpe 's/
$ ps -p $$ -o ppid=
544
/ /g' \ /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline) ## Enable extended globbing patterns shopt -s extglob case $term in ## If this terminal is a python or perl program, ## then the emulator's name is likely the second ## part of it */python*|*/perl* ) term=$(basename "$(readlink -f $(echo "$term" | cut -d ' ' -f 2))") version=$(dpkg -l "$term" | awk '/^ii/{print $3}') ;; ## The special case of gnome-terminal *gnome-terminal-server* ) term="gnome-terminal" ;; ## For other cases, just take the 1st ## field of $term * ) term=${term/% */} ;; esac version=$(dpkg -l "$term" | awk '/^ii/{print $3}') echo "$term $version" }

Donc, nous pouvons le rendre un peu plus complexe (il y a quelques basismes ici, celui-ci n'est pas portable):

$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator

Cela fonctionne pour tous les cas sur lesquels j'ai testé.

    
réponse donnée terdon 04.06.2014 - 14:10
la source
7

Essayez ceci,

ps -aux | grep 'ps -p $$ -o ppid=' | awk 'NR==1{print $11}'

OU

ps -aux | grep 'ps -p $$ -o ppid=' | awk 'NR==1{print $NF}'
    
réponse donnée Avinash Raj 04.06.2014 - 12:28
la source
6
basename "$(cat "/proc/$PPID/comm")"

$PPID est le PID du processus parent du shell. comm signifie commande . Il peut s'agir ou non d'un chemin complet. Nous utilisons donc basename pour supprimer le chemin si nécessaire.

Mises en garde

Celles-ci s'appliquent probablement à au moins certaines des autres réponses.

  • comm est techniquement argv[0] , ce qui peut en fait être une chaîne arbitraire. Mais en général, vous devriez pouvoir vous y fier dans ce cas particulier.

  • Cela ne fonctionnera pas comme prévu si vous vous connectez via SSH ou si vous utilisez tmux , screen ou quelque chose de similaire.

réponse donnée nyuszika7h 04.06.2014 - 17:05
la source
1

Vous pouvez essayer la commande suivante:

$ dpkg-query -W $COLORTERM
gnome-terminal  3.6.2-0ubuntu1

Mise à jour (merci à OP et à Avinash Raj):

$ dpkg-query -W $(ps -aux | grep "'ps -p $$ -o ppid='" | awk 'NR==1{print $11}' | xargs basename)
rxvt    1:2.7.10-5
    
réponse donnée Sylvain Pineau 04.06.2014 - 11:59
la source
0

Une autre possibilité (pas parfaite) est la suivante:

xprop -id $WINDOWID WM_CLASS | cut -d" " -f3 | sed 's/^.\(.*\)..$//'

Mais cela ne fonctionne pas avec lxterminal car il y a la variable d'environnement $WINDOWID empty ...

Terminator affiche le nom "x-terminal-emulator".

    
réponse donnée TuKsn 18.06.2014 - 13:01
la source

Lire d'autres questions sur les étiquettes