E não diga " $TERM
" - é sempre xterm
.
Como um bash
script pode dizer em qual terminal está sendo executado, especificamente se é iTerm, Terminal.app ou, na verdade, um xterm?
Eu pergunto porque reset
não funciona fora da caixa no Terminal.app e iTerm2. O iTerm2, no entanto, reconhece uma sequência de escape para fazer um reset de terminal ( \x1b]50;ClearScrollback\x07
), e se eu pudesse detectá-lo, eu poderia substituir reset
por um alias que fizesse a coisa certa. AFAICT, Terminal.app não possui uma sequência de reinicialização, e as pessoas recorrem à ridícula tom-hacker para descobrir isso .
Meu objetivo final aqui é ter reset
o mesmo trabalho, seja trabalhando no OS X ou Linux, trabalhando local ou remotamente através do SSH. (Eu não quero ter que tentar lembrar qual, e é útil fazer reset && command-that-outputs-a-bunch
e ter up-enter funcionar.) Terminal.app e iTerm estão jogando uma chave neste plano, não implementando reset
corretamente.
Isso significa que simplesmente reset
não há nada: se estou em uma máquina Linux, ele precisa saber se estou usando o gnome-terminal
iTerm para enviar a sequência de escape correta.
Existe alguma maneira (mesmo se eu precisar de um ioctl
) para perguntar ao terminal o que realmente é?
ThePara os fins desta questão, a reinicialização deve limpar a tela, redefinir o cursor e limpar o buffer de rolagem.
fonte
Terminal.app
as configurações, a guia do terminal e definir as linhas de rolagem para 0? Isso desativa todo e qualquer texto acima da linha atual, ou qualquer coisa acima da parte superior da tela? Eu sei, não é exatamente o que você pediu, vale um tiro.reset
, já que é o que meus dedos sabem.reset
comando para limpar o conteúdo de rolagem traseira do emulador de terminal, mas isso não é garantido para fazer isso, porque scroll-back é um recurso específico do emulador de terminal, não realmente um parte de um terminal. No entanto, o Terminal suporta uma extensão da sequência de escape ED (Apagar na Exibição) para apagar o deslocamento de retornoESC [ 3 J
. Você pode limpar a tela, então use isso, por exemplo,reset && printf '\e[3J’
xterm
(através deTERM=xterm
) eu esperaria que você emula um superconjunto do XTerm, que limpa o seu retrocesso na reinicialização. (Assim como se você mandasse a seqüência de escape para "blue", você esperaria azul.) Concedido, meu xterm me diz issoErase is backspace.
, o que eu sou grato mais nada faz; isso é simplesmente chato.Respostas:
Use
$TERM_PROGRAM
.iTerm configura para
iTerm.app
e Terminal.app paraApple_Terminal
.fonte
sshd_config
'sAcceptEnv
provavelmente. Como isso (seu shell é executado em um host diferente daquele em que o seu Terminal é executado) é uma informação muito importante, deve ser parte da questão.$TERM
não tem nada a ver com o emulador de terminal atualmente em execução, é apenas o seu terminal padrão e pode ser configurado para qualquer coisa. Para obter o nome do emulador de terminal que você está executando, você pode usarps
para obter o PID do processo pai do seu shell atual.NOTA: O seguinte falhará no OSX, mas deverá funcionar bem no Linux
O PID do seu processo shell atual é
$$
. A partir daí, você pode usarps
para mostrar uma árvore de processos e imprimir o PID do pai da sua sessão atual do shell:Você pode então passar esse PID para
ps
e dizer para imprimir o nome do comando:Isso vai truncar o nome, deve ser o suficiente para você descobrir, mas pode não ser bom para o script. Para obter o nome completo, você pode tentar
Isto é o que eu recebo no meu sistema usando alguns terminais diferentes:
terminator
gnome-terminal
xterm
fonte
ps: illegal option -- f
-
antes das opções deve funcionar de acordo com o OSXman ps
.$2
, PPID é$3
) e o processo pai do shell pode serlogin
(dependendo da configuração do Terminal), com parâmetros diferentes. No entanto, seu processo pai éTerminal
.--no-headers
não existe, você precisaria de algo parecidotail -n1
. E como todos os processos com interface do usuário têm um argumento-psn_0_...
,awk '{print $NF}'
também não funciona.Aqui está uma maneira portátil de obter o nome ou o caminho do processo pai:
iTerm 2:
gnome-terminal no Ubuntu:
Terminal.app:
Observe que, se Terminal.app estiver configurado para abrir novos shells com o shell de login padrão, o processo pai do shell será,
login
e não o terminal.A
comm
coluna é o caminho completo do comando no OS X e o nome do comando truncado para 15 caracteres na implementação do procps no Linux.fonte
login
- Eu personalizar meu perfil algum tempo atrás para executar o comandologin -fp danielbeck
?