Como verificar qual emulador de terminal está sendo usado atualmente?

9

Eu tenho o gnome-terminal e o Guake instalados. Desejo que diferentes mensagens de inicialização sejam exibidas nesses emuladores de terminal conforme eles são iniciados. Qual código devo escrever em .bashrc para que isso seja alcançado?

    
por VedVals 31.10.2012 / 19:14

7 respostas

10

Esta função deve fazer o trabalho:

container() {
    pid=$$
    while true; do
        pid=$(ps -h -o ppid -p $pid 2>/dev/null)
        case $(ps -h -o comm -p $pid 2>/dev/null) in
        (gnome-terminal) echo "Running in gnome terminal";return;;
        (xterm) echo "Running in xterm";return;;
        (rxvt) echo "Running in rxvt";return;;
        (python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;;
        esac
        [[ $(echo $pid) == 1 ]] && break
    done
}
container
    
por jlliagre 31.10.2012 / 19:36
6

Você pode obter o nome do emulador de terminal, usando o nome do processo dos pais. Por isso, funciona com todos os emuladores de terminal.

No bash, zsh, etc .:

basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')

Com casca de peixe:

basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')
    
por mamiu 07.08.2014 / 12:53
4

Tente isto:

echo $TERM

Isso é mais autoritativo, mas pode ser confundido pelos seus programas. No entanto, no meu, diz xterm e no ttys ele diz linux , o que eu acho que significa Linux Console.

    
por CMCDragonkai 08.02.2016 / 06:58
0

Em muitos sistemas linux echo $TERM return xterm veja stazher post acima.

Para obter o terminal real em uso, faça o seguinte:

1: feche todas as instâncias de terminal atualmente em execução.

2: Abra um novo terminal usando seu método usual.

3: digite o comando da seguinte forma:

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

4: O retorno deve ser algo assim:

lxterminal --geometry=135x20

Aqui está o detalhamento:

Então: ps é "status do processo"

ps option -o is Exibe informações associadas ao espaço ou lista separada por vírgulas de palavras-chave especificadas. Parece complicado, mas não é realmente. (espaço ou vírgula) separados (lista de palavras-chave) especificada.

Portanto, (lista de palavras-chave) é 'cmd=' Apenas uma palavra-chave na lista. Então, apenas pedindo para exibir o comando para abrir o terminal.

ps opção -p é "por id do processo" Uau, essa é uma opção muito boa para o ps. O problema é que você deve passar para ps este id de processo. Então, como obter o ID do processo? Nós desembrulhamos a expressão $(ps -o 'ppid=' -p $$)

Aqui devemos começar a pensar um pouco mais. Eu gostaria de ter inventado este bash one-liner, mas não o fiz. Eu acho que eu roubei de link em algum lugar, eu não pude encontrar novamente. Esses caras são incríveis, mas muitas vezes eu não consigo entender o que eles dizem para fazer até depois de muito estudo. O que podemos fazer é entender isso agora, porque vou explicar.

então sabemos $ é operador de expansão no bash. Eu gosto de pensar "un-wrap". Então, $(foo -opt bar) irá desembrulhar, ou expandir, "foo -opt bar". Mas no bash, chave de um único turno (...) abre subshell.

Portanto, $(foo -opt bar) expande "foo -opt bar" como executado no shell filha . Muito estranho e difícil de entender.

OK, agora estamos executando o comando quase idêntico novamente, ps -o 'ppid=' -p $$ mas desta vez ps, status do processo, mostra o que ele pode ver de dentro da instância do shell filha .

-o lista de palavras-chave, apenas uma palavra-chave como antes, mas ppid= está solicitando diretamente o ID do processo do shell pai !! De dentro da filha SHELL! Muito inteligente, sim? Estou tão animada quando consigo entender isso!

-p novamente, "por ID do processo" e no bash $$ é o ID do processo.

Se você chamar ps -o 'ppid=' -p $$ , ou qualquer outro comando pedindo $$ diretamente do primeiro shell, ele pode dizer pid = 1, ou o pid do xWindow, ou do seu programa de desktop, ou você pode obter o pid real de casca. Se você perguntar muitas vezes, talvez receba uma resposta diferente a cada vez!

Mas, se você invocar uma filha e perguntar "quem é o seu pai", ela lhe dirá! Muito esperto. Eu gostaria de poder ser tão genial para inventar este método.

    
por stazher 01.01.2017 / 00:43
0

Você está correto, eu só respondi por uma questão de título, não por uma questão no corpo. Então aqui vai você e seu tio.

Não tenho certeza sobre o que foi a mudança de caso, em uma resposta mostrada acima. Tal comutador de caso não é necessário. Meu script ~ / .bashrc é na verdade apenas uma linha simples, todos os comandos de eco são apenas para diversão. Como explicar ...

Qualquer termo ao iniciar lê ~ / .bashrc e executa todos os comandos que ele verá em .bashrc. Portanto, não importa qual termo seja chamado, ele lerá .bashrc e executará os comandos, portanto, somente a estrutura necessária em .bashrc seria modificar o comportamento ou excluir um termo ou outro. O comportamento desejado é para cada termo executar o mesmo comando, portanto, a alternância de maiúsculas e minúsculas não é necessária. O próprio terminal lhe dirá como ele foi chamado, então não há necessidade de diferenciá-lo.

Nota (1) Eu não testei para guake, mas trabalhei para todos os outros mencionados na primeira resposta por jlliagre.

Nota (2) Devido à formatação no markdown para o wiki, você não pode recortar e colar como mostrado. Você deve excluir cada backtick , inclusive para excluir os caracteres sublinhados e adicionar o backtick real, sem espaço antes do ps ou após o -p $$) .

script para ~ / .bashrc

# show welcome message for actual terminal in use
echo "Welcome.  You are attempting to use"
echo ""
echo _backtick_ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)_backtick_
echo ""
echo "Good Luck and God Speed."

Isso foi muito divertido. Eu adicionei isso ao meu próprio ~ / .bashrc.

    
por stazher 01.01.2017 / 11:23
0

se você estiver usando o bash, acho que este comando irá ajudá-lo:

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

    
por Wang Shidong 05.06.2017 / 17:50
0

Se você estava usando o ZSH, existe uma solução melhor (mais rápida), que usa apenas os recursos internos do ZSH e manipula /proc/$pid/{stat,cmdline} diretamente.

get-terminal-emulator() {
    if [[ $TTY = "/dev/tty"* ]]; then
        echo "linux-console"
        return
    fi
    local pid=$$ name=''
    while true; do
        proc_stat=(${(@f)$(</proc/${pid}/stat)})
        name=${proc_stat[2]//[()]/}
        case "${name}" in
            gnome-terminal|konsole|rxvt|xterm)
                echo "${name}"; return ;;
            python*)
                local cmdline=(${(@f)$(</proc/${pid}/cmdline)})
                if [[ "$cmdline" =~ "\bguake.main\b" ]]; then
                    echo "guake"; return
                fi
                ;;
        esac
        if test "$pid" = "1" -o "$pid" = ""; then
            echo "unknown"
            return
        fi
        pid=${proc_stat[4]}       
    done
}
    
por André von Kugland 20.10.2017 / 21:53