Exibe o comando na barra de título do xterm

22

Meu Prompt de Bash está configurando a barra de título do xterm usando a seguinte sequência:

PS1='3]0;\u@\h>\w
PS1='3]0;\u@\h>\w%pre%7'
7'

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

    
por dogbane 10.03.2011 / 16:33

3 respostas

14

Basicamente, você precisa:

trap 'printf "3]0;%s
trap 'printf "3]0;%s%pre%7" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG
7" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

no final do seu .bashrc ou similar. Levei um tempo para resolver isso - veja minha resposta aqui para mais informações:)

    
por 10.03.2011 / 16:42
13

(Inspirado por esta resposta SU )

Você pode combinar alguns truques bash:

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

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

trap 'printf "3]0;%s
set -o functrace
7" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

Isso manterá o título mudado até que algo mais o altere, mas, contanto que seu $PS1 permaneça o mesmo, não será um problema - você inicia um comando, o manipulador DEBUG altera a barra de título e, quando comando termina bash desenha um novo prompt e redefine sua barra de título novamente.

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

trap 'printf "3]0;%s
set -o functrace
7" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

Isso fará o bash propagar a interceptação DEBUG para qualquer subshell que você iniciar; caso contrário, a barra de título não será alterada neles

    
por 10.03.2011 / 16:41
2

Trabalhei em torno da minha própria solução a partir de vários posts. Isso cria um título contendo o comando user, hostname, pwd, tty e atualmente executado (por bash).

Isto se parece com isto (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 no .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+="\[3]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.
# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "3]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.
.:[user@hostname:/home/user][pts/10]:.
7"' DEBUG
7\]"

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

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

Sinta-se à vontade para adotar as suas necessidades.

    
por 14.05.2016 / 17:57