Obtém o nome do emulador de terminal dentro do script de shell

3

Eu usei pstree para encontrar o nome do emulador pai de execução do shell script usando algo semelhante ao seguinte:

pstree -s $PPID | awk -F '---' '{print $6}'

Isso funciona no meu sistema atual. Eu testei em mate-terminal e xterm , mas não tenho certeza se isso funcionará em outros sistemas / plataformas Linux e outros terminais. Existe uma maneira melhor / mais organizada (de maneira mais portátil) de alcançar isso?

    
por coffeMug 19.02.2016 / 12:38

2 respostas

5
ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"

Pode lhe dar bons resultados. Ele fornece o nome do processo que é o pai do líder da sessão. Para processos iniciados em um emulador de terminal, geralmente seria o processo que executa o emulador de terminal (a menos que itens como screen , expect , tmux ... estejam sendo usados (embora observe que screen e tmux são emuladores de terminal) ou novas sessões são iniciadas explicitamente com setsid , start-stop-daemon ...)

Se você encontrar parênteses aninhados difíceis de ler, poderá escrevê-lo em várias linhas:

ps -o comm= -p "$((
                  $(
                    ps -o ppid= -p "$((
                                      $(
                                        ps -o sid= -p "$$"
                                      )
                                    ))"
                  )
                ))"

Ou use variáveis (que também podem ajudar a tornar o script mais auto-explicativo):

sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")

Você também pode tentar analisar wtmp , em que os emuladores de terminal geralmente registram uma entrada com seu pid associado ao dispositivo de pseudo-terminal. Isso funciona para mim em um sistema Debian desde que expect / screen / tmux ... não esteja envolvido:

ps -o comm= -p "$(
  dump-utmp -r /var/log/wtmp |
  awk -v tty="$(ps -o tty= -p "$$")" -F ' *\| *' '
    $2 == tty {print $5;exit}')"

(usando dump-utmp do GNU acct ).

    
por 19.02.2016 / 14:01
1

Para encontrar o nome do emulador de terminal usado pelo shell atual, você pode pedir ao sistema de janelas X para fornecer o nome da janela em que o shell está atualmente visível:

$ xwininfo -id $WINDOWID | awk '/^xwin/ { print $NF }'

Isso devolve a string "xterm" para mim no XTerm e "urxvt" quando eu executo o Rxvt-unicode. O resultado provavelmente será diferente se você tiver o hábito de mudar o título da janela, porque é isso que está sendo devolvido para você aqui, eu acho.

    
por 19.02.2016 / 13:50