Set tela-título do script shell
-
18-09-2019 - |
Pergunta
É possível definir o título da tela usando um shell script?
Eu pensei em algo como enviar a chave comandos Ctrl + A mudar - A Name
digite
Eu procurei por cerca de uma hora sobre como emular batidas de tecla em um script shell, mas não encontrou a resposta.
Solução
Você pode definir o título da tela / xterm usando as seguintes linhas:
#!/bin/bash
mytitle="Some title"
echo -e '\033k'$mytitle'\033\\'
[UPDATE] - por pedido Eu também estou incluindo a solução proposta pela @Espo abaixo:
Dependendo da sua versão xterm ou sua distribuição Linux a linha acima pode ou não trabalho e você pode tentar os xterm-padrões:
#!/bin/bash
mytitle="Some title"
echo -e '\033]2;'$mytitle'\007'
Para saber mais sobre os detalhes ver: http: // www .faqs.org / docs / Linux-mini / Xterm-Title.html # s3 ou consultar a resposta por @Espo abaixo.
Outras dicas
A partir http://www.faqs.org/docs /Linux-mini/Xterm-Title.html#s3
seqüências xterm de fuga
janela e ícone títulos podem ser alteradas em um xterm em execução usando XTerm sequências de escape. Os seguintes seqüências são úteis a este respeito:
ESC]0;stringBEL
- Defina o nome do ícone e título da janela para stringESC]1;stringBEL
- Defina o nome do ícone para stringESC]2;stringBEL
- Definir título da janela para stringonde ESC é o caractere de escape (\ 033), e BEL é o personagem sino (\ 007).
Impressão uma dessas sequências dentro o xterm fará com que a janela ou ícone título a ser alterado.
Nota: essas seqüências se aplicam a mais derivados xterm, tais como, nxterm cor-xterm e rxvt. outro terminal tipos costumam usar diferentes escapes; Vejo o apêndice para exemplos. Para o lista completa de sequências de escape xterm ver a ctlseq2.txt arquivo, que vem com a distribuição xterm, ou xterm.seq, que vem com o rxvt distribuição.
Imprimir as sequências de escape
Para obter informações que é constante durante todo o tempo de vida deste shell, tais como anfitrião e nome de usuário, ele será basta simplesmente ecoar a fuga string no arquivo de shell rc:
echo -n "\033]0;${USER}@${HOST}\007"
deve produzir um título como username @ hostname, assumindo o shell variáveis ??$ USUÁRIO e US $ acolhimento, são definidos corretamente. As opções necessárias para eco pode variar de acordo com casca (ver exemplos abaixo).
Para obter informações que podem mudar durante a vida do shell, como atual diretório de trabalho, estes escapes realmente precisa ser aplicada sempre as rápidas mudanças. Desta forma, o string é atualizado com todos os comandos você emitir e pode manter o controle de informações tais como trabalho atual diretório, nome de usuário, nome da máquina, etc. Alguns escudos fornecer funções especiais para este fim, outros não e nós tem que inserir as sequências de título diretamente na sequência do prompt. Esta é ilustrado na próxima seção.
A seguir, são outras maneiras de roteiro a renomeação de títulos de tela:
Adicionando as seguintes configurações para .ssh/config
define o título da tela automaticamente após a autenticação para um sistema usando SSH:
Host *
PermitLocalCommand yes
LocalCommand [ "$TERM" == 'screen' ] && echo -ne "\033k%h\033\\"
Em vez de %h
, que representa o nome da máquina que está a ligar com, você pode usar %n
, que é o real nome / apelido que você usou para se conectar à máquina.
NOTA: Você precisa OpenSSH> = v5.1 para ser capaz de usar o Localhost% n e% parâmetros h. Confira 'homem ssh_config' para mais informações sobre LocalCommand.
Para reverter automaticamente o título, de volta ao da hostname do localhost, depois de fechar a sessão SSH, você pode adicionar uma sequência de escape para você PS1
variável pronta em .bashrc
:
export PS1='you_favorite_PS1_here'
if [ "$TERM" == 'screen' ]; then
export PS1=${PS1}'\[\033k\h\033\\\]'
fi
Esses truques são especialmente úteis quando se usa uma configuração .screenrc
que lhe mostra de que 'guia' tela que você está trabalhando atualmente. Adicionar algo como o seguinte para .screenrc
para começar este trabalho:
caption always "%{= kY}%-w%{= Yk}%n %t%{-}%+w%{ kG} %-= @%H - %LD %d %LM - %c"
Tente a seguir comandos, não há necessidade de editar qualquer arquivo ou configuração como ~ / .bashrc, pode ser usado em tempo de execução.
Definir texto estático como título: (My Title)
export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Set variável local / global como título: ($ USER)
export PS1='\[\e]0;$USER\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Set saída de comando como título: (hostname)
export PS1='\[\e]0;`hostname`\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Definir como padrão (Revert para trás):
export PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
set_screen_title ()
{
echo -ne "\ek$1\e\\"
}
Você também pode ligar tela e dizer-lhe para definir um título:
screen -X title "new title"
Se você estiver em uma janela de tela, ele irá definir o nome dessa janela. Se você não estiver na tela, ele irá definir o nome de janela aberta mais recentemente.
Para adicionar a resposta de Espo, as seqüências xterm de fuga também pode ser aplicada à variável Bash PS1
ESC]0;stringBEL -- Set icon name and window title to string
ESC]1;stringBEL -- Set icon name to string
ESC]2;stringBEL -- Set window title to string
Exemplo
PS1='\e]0;string\a'
Para ativar a atualização título automático quando pulando com ssh, adicione a ~/.bashrc
:
ssh() {
echo -n -e "\033k$1\033\\"
/usr/bin/ssh "$@"
echo -n -e "\033k`hostname -s`\033\\"
}
echo -n -e "\033k`hostname -s`\033\\"
Consulte http: //linuxepiphany.blogspot. com.ar/2010/05/good-screenrc-config-setup.html
# add the following in your ~/.bashrc or ~/.bash_profile
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
ou ainda melhor copiar todo o conceito para personalizar suas configurações festança entre um monte de hosts de aqui
A minha solução para este problema era criar um script e adicioná-lo ao meu arquivo ~ / .bashrc:
set-title() {
ORIG==$PS1
TITLE="\e];$@\a"
PS1=${ORIG}${TITLE}
}
Agora, quando estou em qualquer sessão shell bash, eu digito "desired_title set-título" e ele muda para "título desejado". Isso funciona para várias versões do Ubuntu, atualmente no Kinetic 16.04
Eu tenho esta solução de aqui . Eu estava olhando para ele novamente, não poderia encontrá-lo e pensei que eu ia postar aqui para qualquer pessoa interessada.
Eu tenho esta solução de experiências com outros, como @ Flurin-Arner Comecei o @ Weston ganger set-título () . Eu também usei @ imgx64 PROMPT_DIRTRIM sugestão. Eu também estou usando @itseranga git prompt de ramo , embora isso não tem nada a ver com a questão ele mostra o que você pode fazer com o prompt.
Primeiro, como mostrado por Weston e acima
TITLE="\[\e]2;$*\a\]"
pode ser usado para definir manualmente o Terminal título, "$ *" é a entrada de linha de comando, mas não o que nós queremos.
2 como indicado Eu também estou adicionando git branch à minha solicitação, novamente não faz parte da pergunta.
export PROMPT_DIRTRIM=3
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
3, pela experiência que eu copiou o código título acima, defina a $ * a uma corda fixa e tentei isso:
see: \[\e]2;'SomeTitleString'\a\]
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;'SomeTitleString'\a\] $ "
Isto teve o efeito desejado! Em última análise, eu queria que o caminho de base como o meu título. PS1 Parâmetros mostra que \ W é a base caminho para a minha solução é esta:
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;\W\a\] $ "
sem o ramo git:
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\[\033[00m\]\[\e]2;\W\a\] $ "
resultando em um tempo com git-ramo:
user@host ~/.../StudyJava (master) $
resultando em um prompt sem parse_git_branch:
user@host ~/.../StudyJava $
onde pwd dá
/home/user/somedir1/otherdir2/StudyJava
e Terminal Título
StudyJava
NOTA: A partir @seff acima eu sou essencialmente substituindo o "Meu Título" com "\ W"
export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '