Exibir comando na barra de título do xterm

23

No momento, o My Bash Prompt está configurando a barra de título xterm usando a seguinte sequência:

PS1='\033]0;\u@\h>\w\007'

Existe uma maneira fácil de exibir o comando atual na barra de título. Por exemplo, se estou seguindo um arquivo usando tail -f foo.log, quero que minha barra de título diga tail -f foo.log.

dogbane
fonte

Respostas:

16

Basicamente, você precisa de:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

no final do seu .bashrcou similar. Demorei um pouco para resolver isso - veja minha resposta aqui para obter mais informações :)

simon
fonte
Obrigado por esta solução simon! No entanto, ao adicionar isso ao meu .bashrcapós cada comando no meu shell, recebo essa saída 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Suponho que posso suprimir essa saída atribuindo o comando trap a PS1? No entanto, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGnão funciona. Isso leva ao erro bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
orschiro
BTW, acabei de colocar o stackoverflow.com/questions/48407130/… , perguntado presumivelmente como resultado dessa aplicação. A armadilha deve ser escrita diretamente no stderr ou no TTY, não no stdout.
Charles Duffy
11
@orschiro, o conselho para executar o trapcomando como um comando separado , não para atribuí-lo ao PS1.
Charles Duffy
12

(Inspirado por esta resposta SU )

Você pode combinar alguns truques do bash:

  • Se você interceptar um sinal DEBUG, o manipulador é chamado antes de cada comando ser executado
  • A variável $BASH_COMMANDmantém o comando atualmente em execução

Portanto, prenda DEBUG e faça com que o manipulador defina o título para $BASH_COMMAND:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

Isso manterá o título alterado até que outra coisa o altere, mas enquanto você $PS1permanecer o mesmo, não será um problema - você inicia um comando, o manipulador DEBUG altera a barra de título e, quando o comando termina, o bash cria um novo prompt e redefine sua barra de título novamente.

Uma dica útil encontrada aqui (também de onde veio a resposta da SU) é incluir:

set -o functrace

Isso fará com que o bash propague a interceptação DEBUG para todos os subshells iniciados; caso contrário, a barra de título não será alterada

Michael Mrozek
fonte
ha! mesma resposta exatamente ao mesmo tempo! +1 para lidar com subcascas, mas você tem alguma resposta para o problema de tubulações? (ver o meu link para a pergunta SO)
simon
Não funciona atravésssh
abyss.7
Também "mata" a conclusão na "guia"
abyss.7
BTW, acabei de colocar o stackoverflow.com/questions/48407130/… , perguntado presumivelmente como resultado dessa aplicação. A armadilha deve ser escrita diretamente no stderr ou no TTY, não no stdout.
Charles Duffy
Não seria melhor redirecionar para em /dev/ttyvez de stderr?
Aaron Digulla 26/03
2

Eu trabalhei com minha própria solução em várias postagens ao redor. Isso cria um título contendo usuário, nome do host, pwd, tty e comando atualmente executado (para bash).

Parece com isso (nenhum comando sendo executado):

.:[user@hostname:/home/user][pts/10]:.

E assim (executando um comando):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

Em algum lugar do .bashrc, estendi o PS1:

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

Adiciona o comando atual, usando o histórico 1 e trap :

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

Sinta-se livre para adotar as suas necessidades.

Alejandro Alanis
fonte
BTW, acabei de colocar o stackoverflow.com/questions/48407130/… , perguntado presumivelmente como resultado dessa aplicação. A armadilha deve ser escrita diretamente no stderr ou no TTY, não no stdout.
Charles Duffy