Como posso obter o nome do terminal atual a partir da linha de comando?

23

Existe a possibilidade de obter o tipo de terminal com um comando?

Se eu estiver usando gnome-terminal , a saída deve ser gnome-terminal ou algo semelhante. Também seria bom obter a versão do terminal.

Atualizar

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

produzirá algo assim:

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

Isso também funcionará com o xterm, mas como obtenho apenas o nome ( xfce4-terminal neste caso)?

    
por TuKsn 04.06.2014 / 11:51

5 respostas

27

Versão original

Uma maneira de fazer isso é obter o processo pai de sua sessão atual do shell e, a partir daí, o nome do terminal.

  1. Obtenha o pai do processo shell atual. A variável bash $$ é o PID do seu shell atual, portanto, podemos fornecer isso como uma consulta para ps ( -p $$ ) e solicitar que ele imprima o PID do processo pai ( -o ppid= , o% final)= é evitar imprimir cabeçalhos de coluna):

    $ ps -p $$ -o ppid=
    544
    

    Portanto, o PID do pai do meu shell é 544 .

  2. Obtenha o processo associado a esse PID e imprima sua linha de comando

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

    A saída acima dependerá do emulador de terminal que você está usando, estou usando terminator .

  3. Combine tudo em um único comando

    ps -p $(ps -p $$ -o ppid=) o args=
    
  4. Use isso para obter a versão

    $(ps -p $(ps -p $$ -o ppid=) o args=) --version
    terminator 0.97
    
  5. Adicione uma pequena função ao seu ~/.bashrc que retorna o nome e a versão do emulador de terminal que você está usando (isso funciona para a maioria dos emuladores de terminal comuns):

    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}')    
    }
    

    Agora você pode obter o nome do terminal e também passar qualquer opção que desejar (como --version .

Alguns exemplos usando terminais diferentes:

  1. xterm

    $ which_term
    XTerm(297)
    
  2. terminator

    $ which_term 
    terminator 0.97
    
  3. rxvt , este não tem nenhum dos sinalizadores -V , -version ou --version , portanto, nenhuma informação de versão é impressa.

    $  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/>.
    

Novo e melhorado

A abordagem acima não é tão confiável. Ele irá sufocar quando você executar seu shell após su ing para outro usuário ou quando seu terminal estiver com alias para algo e vários outros casos. Como obviamente estamos trabalhando com programas X aqui, uma maneira melhor seria usar algo como xdotool (instalável com sudo apt-get install xdotool ) para obter as informações:

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

O texto acima imprimirá a linha de comando usada para iniciar a janela ativa no momento. Como o seu terminal, presumivelmente, estará ativo, esse é o comando que ele mostrará. Isto significa que para a maioria dos emuladores de terminal, você pode seguramente assumir que o primeiro campo retornado é o nome do terminal:

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

Isso significa que obter a versão é trivial. Por exemplo

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

Não é assim para 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" }

Então, podemos torná-lo um pouco mais complexo (existem alguns bashisms aqui, este não é portátil):

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

Isso funciona para todos os casos em que testei.

    
por terdon 04.06.2014 / 14:10
7

Tente isso,

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

OR

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

$PPID é o PID do processo pai do shell. comm significa comando . Pode ou não ser um caminho completo, por isso usamos basename para remover o caminho, se necessário.

Advertências

Estes provavelmente se aplicam a pelo menos algumas das outras respostas também.

  • comm é tecnicamente argv[0] , que na verdade pode ser uma string arbitrária. Mas, em geral, você deve poder confiar nele para este caso em particular.

  • Isso não funcionará como esperado se você se conectar por SSH ou usar tmux , screen ou algo semelhante.

por nyuszika7h 04.06.2014 / 17:05
1

Você pode tentar o seguinte comando:

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

Atualização (graças ao OP e ao 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
    
por Sylvain Pineau 04.06.2014 / 11:59
0

Outra possibilidade (não perfeita) é:

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

Mas isso não funciona com o lxterminal porque existe a variável de ambiente $WINDOWID empty ...

Terminator mostra o nome "x-terminal-emulator".

    
por TuKsn 18.06.2014 / 13:01