Eu tenho o Ubuntu na minha máquina e estou executando um gerenciador de janelas incrível em cima dele. Como verifico qual terminal estou executando? Existe um comando para isso?
command-line
gnome-terminal
user4943481
fonte
fonte
Respostas:
TL; DR
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. O valor depid
posterior pode ser passado para ops -p <pid> -o args
comando.Tecnicamente, para o emulador de terminal, você nem precisa de um comando, conforme declarado nos comentários :
Shell vs Terminal
A primeira coisa que precisamos esclarecer é o que exatamente está sendo solicitado - descubra o shell ou terminal em execução. Frequentemente, esses dois termos são usados de forma intercambiável, mas são coisas completamente diferentes. O shell é o intérprete da linha de comando, o shell especificamente interativo é o prompt mais o campo de texto onde você insere comandos. Os shells também podem ser não interativos, por exemplo, um script inicia um shell não interativo ou
bash -c 'echo hello world'
também um shell não interativo.Por outro lado, terminal é a interface para o shell (embora também possa ser outra aplicação). Originalmente, o terminal se referia ao hardware real, mas hoje em dia é principalmente software. O que você vê quando pressiona Ctrl+ Alt+ tou clica no ícone do terminal na GUI, que inicia um emulador de terminal, uma janela que imita o comportamento do hardware e, nessa janela, você pode ver o shell em execução. Ctrl+ Alt+ F2(ou qualquer uma das 6 teclas de função) abrirá o console virtual, também conhecido como
tty
. Eu recomendo a leitura Por que o terminal virtual é "virtual" e o que / por que / onde é o terminal "real"? para mais informações sobre os detalhes.Obtendo as informações do shell
Cada usuário tem um shell padrão designado
/etc/passwd
para seu nome de usuário. Supondo que você esteja usando a configuração padrão e não tenha chamado outro shell explicitamente como um comando, é suficiente:Mas é claro que isso mostra apenas o valor padrão . Suponha que façamos o seguinte:
Estávamos originalmente no
bash
, mas começou a sessão interativa de/bin/dash
, POSIX do Ubuntu ou shell do sistema . A variável$SHELL
não muda, porque esse não é o seu objetivo - mostra o valor padrão e não o atual. Precisamos abordar isso de outra perspectiva - a perspectiva de um processo, que é algo que abordamos em Estou usando bash ou sh?Aqui aproveitamos o
/proc/
sistema de arquivos. O nome dos parâmetros do processo e de linha de comando são exibidos no/proc/<pid>/comm
. Tudo o que precisamos é fornecer o PID do shell, que é o que$$
faz. No exemplo acima, estou adicionando isso separadamente, mas não há nada que nos impeça de fazer apenasVariações sobre o tema também podem ser
Outra maneira de abordarmos isso é verificar onde
/proc/<pid>/exe
. Este arquivo é um link simbólico que aponta para o arquivo executável. Assim nós podemos fazerQualquer uma das duas abordagens funciona em 99% dos casos. Obviamente, existem maneiras pelas quais elas podem ser subvertidas. Por exemplo, ligação simbólica não irá apontar em qualquer lugar se o executável foi eliminada logo após o shell começou (e, nesse caso, provavelmente você vai encontrar problemas do sistema, uma vez que a remoção
/bin/sh
,/bin/dash
ou até mesmo/bin/bash
não é recomendado - afinal um monte de scripts de contar com eles , especialmente os de nível de sistema). O nome do comando para o shell geralmente é definido como o primeiro argumento noexecve()
syscall. Isso é abordado em Como o bash sabe como está sendo chamado? , portanto, se você tiver um aplicativo que inicie um shell viaexecve()
, ele poderá fornecer qualquer nome. Mas essas são coisas não padronizadas e não típicas, que devem ser evitadas por uma questão de consistência e segurança.Obtendo informações do terminal
Podemos começar com as variáveis de ambiente. Muitos terminais parecem se mascarar como
xterm
incompatíveis, o que é relatado porecho $TERM
ouecho $COLORTERM
. Mas as variáveis de ambiente não são uma ferramenta muito confiável. Eles podem ser definidos e desabilitados. Podemos fazer a mesma coisa com PIDs novamente, exceto que desta vez veremos o PID pai. Como você deve se lembrar, terminal é a interface para o shell e geralmente inicia o próprio shell. Portanto, podemos descobrir qual processo é o processo pai do nosso shell:Vamos tentar com outro aplicativo de terminal
sakura
:A partir daí, já podemos ver que o que iniciou esse shell é
gnome-terminal
. É claro que esse método funciona assumindo que você esteja trabalhando com shell interativo. Se estamos tentando descobrir o paibash -c '...'
ou o shell iniciado viassh
, por exemplo, o PID pode muito bem ser de um aplicativo não terminal e talvez não uma GUI.Portanto, se queremos lidar especificamente com o terminal da GUI, o que podemos fazer é executar
xprop
, clicar na janela desejada, cumprimentar seu pid e descobrir qual é o nome desse processo correspondente ao pid. Ou em outras palavras:Além disso, conforme as especificações , os gerenciadores de janelas devem definir a
WM_CLASS
propriedade. Assim, podemos obter issoxprop
também:Obviamente, isso também tem suas 1% de desvantagens: a configuração de
WM_CLASS
propriedades depende do gerenciador de janelas, e não é garantido ao PID que uma janela seja precisa (consulte Qual processo criou essa janela do X11? ), O que pode envolver depuração complexa. E essas não são deficiências dos métodos em si, mas do servidor X11. No entanto, os gerenciadores de janelas mais estáveis e conhecidos (como openbox, Metacity, blackbox) e a maioria dos aplicativos são bem comportados, portanto, não devemos esperar problemas com algo como o Gnome Terminal ou o Terminator.Mas quando se trata de emuladores de terminal da GUI, nem precisamos encontrar um comando. Podemos apenas usar o
About
diálogo da própria janela. A exceção a essa regra éxterm
.fonte
$SHELL
, com certezaps | grep
?ps -p $$
! Ou, apenas para o comandops -p $$ -o cmd=
.ps | grep
é apenas má forma. A maior parte do que você pode grep, pode realmente ser obtida porps
si só ou por outras ferramentas.A versão curta (thx @Serg )
A versão longa
e procure o
*
na saída;)
Saída de exemplo
Ou, graças ao @muru , aqui está uma saída mais detalhada
fonte
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
ouupdate-alternatives: error: unknown argument
–config'`--config
sudo
. Useupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
para obter o destino desse link simbólico, em vez disso, usácat
-lo. Ofile
utilitário deve ser instalado na maioria dos sistemas e pode ser usado para encontrar o executável de destino.cat
no link simbólico pode imprimir qualquer script de shell ou mesmo arquivo binário, dependendo do destino desse link (script de shell paragnome-terminal
, arquivo bináriourxvt
etc.).Se você deseja conhecer o programa do terminal que está usando, use o seguinte:
Execute isso logo após abrir o terminal (shell) sem bifurcar mais nenhuma instância do shell .
Quando você abre o programa do terminal, ele basicamente gera um programa filho, um shell. Portanto, o pai da concha gerada é o próprio terminal. Em outras palavras, o PPID do shell é o PID do programa do terminal.
Aqui estamos encontrando o ID do processo pai (PPID) do shell (
bash
) porps -o 'ppid=' -p $$
, que será o ID do processo do programa do terminal.Em seguida, localizamos o nome do processo no PID:
É basicamente um liner de:
fonte
sshd: username@pts/4
. Note que estou usando o PuTTY para conectar à máquina. Ésshd
realmente o emulador de terminal?Digite na
printenv
janela do terminal para visualizar todas as variáveis da sessão aberta.Digite na
echo $COLORTERM
janela do terminal. OBSERVAÇÃO: isso não funciona com todos os terminais, um delessakura
não informa isso.o abaixo é de um
aterm
terminal.fonte
Se você quiser apenas o nome do programa do terminal, provavelmente o encontrará em Ajuda> Sobre.
fonte
Saída de amostra:
Existe a resposta para o meu sistema: gnome-terminal .
Então, digitar
gnome-terminal
no meu terminal agora abrirá outra janela de terminal idêntica.Fontes:
fonte
Resposta simples. Funciona para console ou ssh.
Exemplo para terminal de caracteres simples:
informa que você não pode abrir aplicativos GUI nessa conexão
Exemplo para xterm (também funciona com PuTTY / Xming no Windows)
significa que você pode usar comandos da GUI, como abrir o editor de folhetos ou o gerenciador de arquivos do nautilus.
No console, é o mesmo:
fonte
TERM
não é uma variável que define o emulador de terminal padrão, mas sim uma que define os recursos do atual. Por exemplo, definir a variável como "xterm-color" permite que qualquer programa em execução no terminal saiba que o terminal atual deve entender as cores; configurá-lo para "linux" informa aos programas que esse é um VT; etc.