Mostrar comando en la barra de título de xterm

23

My Bash Prompt está configurando la barra de título de xterm usando la siguiente secuencia:

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

¿Hay una manera fácil de mostrar el comando actual en la barra de título. Por ejemplo, si estoy siguiendo un archivo usando tail -f foo.log, quiero que mi barra de título diga tail -f foo.log.

dogbane
fuente

Respuestas:

16

Básicamente, necesitas:

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

al final de tu .bashrco similar. Me tomó un tiempo resolver esto; vea mi respuesta aquí para obtener más información :)

simon
fuente
Gracias por esta solución simon! Sin embargo, al agregar esto a mi .bashrcdespués de cada comando en mi shell, obtengo esta salida 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Supongo que puedo suprimir esta salida asignando el comando trap a PS1? Sin embargo, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGno funciona. Conduce al error bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
orschiro
Por cierto, acabo de enviar stackoverflow.com/questions/48407130/… , pregunté presumiblemente como resultado de la aplicación de este consejo. La trampa debe estar escribiendo a stderr o al TTY directamente, no a stdout.
Charles Duffy el
1
@orschiro, el consejo para ejecutar el trapcomando como un comando separado , no para asignarlo a PS1.
Charles Duffy el
12

(Inspirado por esta respuesta SU )

Puedes combinar un par de trucos de bash:

  • Si atrapa una señal DEBUG, se llama al controlador antes de ejecutar cada comando
  • La variable $BASH_COMMANDcontiene el comando actualmente en ejecución

Entonces, atrapa DEBUG y haz que el controlador establezca el título en $BASH_COMMAND:

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

Esto mantendrá el título cambiado hasta que algo más lo cambie, pero siempre y cuando $PS1permanezca igual no será un problema: inicia un comando, el controlador DEBUG cambia la barra de título, y cuando el comando termina, bash dibuja un nuevo pregunta y restablece su barra de título nuevamente.

Un consejo útil que se encuentra aquí (también de dónde proviene esa respuesta SU) es incluir:

set -o functrace

Esto hará que bash propague la trampa DEBUG a cualquier subshell que comiences; de lo contrario, la barra de título no se cambiará en ellos

Michael Mrozek
fuente
¡decir ah! misma respuesta exactamente al mismo tiempo! +1 para manejar subcapas, pero ¿tiene alguna respuesta al problema de las tuberías? (ver mi enlace a la pregunta SO)
Simon
No funcionassh
abyss.7
También "mata" la finalización en "pestaña"
abyss.7
Por cierto, acabo de enviar stackoverflow.com/questions/48407130/… , pregunté presumiblemente como resultado de la aplicación de este consejo. La trampa debe estar escribiendo a stderr o al TTY directamente, no a stdout.
Charles Duffy el
¿No sería mejor redirigir a /dev/ttystderr?
Aaron Digulla
2

Trabajé alrededor de mi propia solución de varias publicaciones. Esto crea un título que contiene usuario, nombre de host, pwd, tty y el comando actualmente ejecutado (para bash).

Esto se ve así (no se ejecuta ningún comando):

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

Y así (ejecutando un comando):

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

En algún lugar de .bashrc, extendí 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\]"

Agrega el comando actual, usando el historial 1 y 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

Siéntase libre de adoptar sus necesidades.

Alejandro Alanis
fuente
Por cierto, acabo de enviar stackoverflow.com/questions/48407130/… , pregunté presumiblemente como resultado de la aplicación de este consejo. La trampa debe estar escribiendo a stderr o al TTY directamente, no a stdout.
Charles Duffy el