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=`
irá produzir algo como isto:
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)?
command-line
TuKsn
fonte
fonte
window 31457282 has no pid associated with it
(testado em Lubuntu)Respostas:
Versão original
Uma maneira de fazer isso é obter o processo pai da sua sessão atual do shell e, a partir daí, o nome do terminal.
Obtenha o pai do processo atual do shell. A variável bash
$$
é o PID do seu shell atual; portanto, podemos fornecer isso como uma consulta paraps
(-p $$
) e solicitar que ele imprima o PID do processo pai (-o ppid=
a seguir=
é para evitar a impressão de cabeçalhos de coluna):Portanto, o PID do pai do meu shell é
544
.Obtenha o processo associado a esse PID e imprima sua linha de comando
A saída acima dependerá do emulador de terminal que você estiver usando
terminator
.Combine tudo em um único comando
Use isso para obter a versão
Adicione uma pequena função ao seu
~/.bashrc
que retorne o nome e a versão do emulador de terminal que você está usando (isso funciona para os emuladores de terminal mais comuns):Agora você pode obter o nome do terminal e também passar qualquer opção que desejar (como
--version
.Alguns exemplos usando diferentes terminais:
xterm
terminator
rxvt
, Este tem nenhum dos-V
,-version
ou--version
bandeiras tão sem info versão está impresso.gnome-terminal
.konsole
lxterminal
xfce4-terminal
Novo e melhorado
A abordagem acima não é tão confiável. Ele engasga quando você executa o shell após
su
acessar outro usuário ou quando o terminal está alias a algo e vários outros casos. Como estamos obviamente trabalhando com programas X aqui, uma maneira melhor pode ser usar algo comoxdotool
(instalável comsudo apt-get install xdotool
) para obter as informações:O texto acima imprimirá a linha de comando usada para iniciar a janela ativa no momento. Como seu terminal, presumivelmente, estará ativo, esse é o comando que ele mostrará. Isso significa que, para a maioria dos emuladores de terminal, você pode assumir com segurança que o primeiro campo retornado é o nome do terminal:
Isso significa que obter a versão é trivial. Por exemplo
Não é assim para
gnome-terminal
:ou
terminator
:Portanto, podemos torná-lo um pouco mais complexo (existem alguns basismos aqui, este não é portátil):
Isso funciona para todos os casos em que testei.
fonte
$PPID
para obter o PID do processo pai.ksh
outcsh
. É uma ideia muito boa para a família bash, já que é muito mais simples do que minha abordagem.ksh93
emksh
.Tente isso,
OU
fonte
rxvt
eterminator
e a segunda falha emuxterm
egnome-terminal
(imprime/usr/lib/gnome-terminal/gnome-terminal-server
). Todos eles falharão (como o meu) se você estiver usando uma sessão su.$PPID
é o PID do processo pai do shell.comm
significa comando . Pode ou não ser um caminho completo, portanto, usamos obasename
strip, se necessário.Ressalvas
Provavelmente também se aplicam a pelo menos algumas das outras respostas.
comm
é tecnicamenteargv[0]
, o que pode realmente ser uma sequência arbitrária. Mas, em geral, você deve poder confiar nisso para esse caso específico.Isso não funcionará conforme o esperado se você se conectar através de SSH ou usar
tmux
,screen
ou algo semelhante.fonte
termin
como saída.$PPID
não é padrão em todas as conchas. por exemplo,tcsh
eu recebo:PPID: Undefined variable.
Você pode tentar o seguinte comando:Atualização (graças ao OP e Avinash Raj):
fonte
gnome-terminal 3.6.2-0ubuntu1l
xterm?Outra possibilidade (não perfeita) é:
Mas isso não funciona com o lxterminal porque a variável de ambiente está
$WINDOWID
vazia ...O Terminator mostra o nome "x-terminal-emulator".
fonte
O terminal atual também pode ser detectado através de uma sequência de escape: The Device Attributes (Secondary DA)
Por exemplo no bash:
Isso retorna apenas algum tipo de identificação - e, infelizmente, não conheço uma lista oficial que as traduza para os nomes reais.
Para uma implementação real, que converta alguns IDs conhecidos em nomes de terminal, consulte este exemplo de script bash: https://github.com/mintty/utils/blob/master/terminal
fonte