Bash – How to make the Xterm window title switch between the current running command and the current path

bashosxpromptwindow titlexterm

I want to set the Xterm window title to switch between two states:

  • When a command is running, show the command name (e.g. "less")
  • When no command is running, show the current path (e.g. "src")

I can create an Xterm window title with the current path with:

$ export PROMPT_COMMAND='echo -ne "\033]0;`basename ${PWD}`\007"'

And I can show the current running command by adding a trap statement to .bashrc:

$ trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG

But I'm not able to automatically switch between the two. Is it possible?

EDIT: @terdon shows a solution that works in a regular xterm, that's cool! But I failed to mention that I use the MacOSX Terminal.app. That shows still shows "bash" instead of the current path when no command is running. With a little tinkering I figured out how to solve this.

Best Answer

You can do this if you use a function that checks whether $BASH_COMMAND is set and prints your CWD if it is not. Add these lines to your ~/.bashrc:

trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG
function show_name(){ 
    if [[ -n "$BASH_COMMAND" ]]; 
    then 
    echo -en "\033]0;`pwd`\007"; 
    else 
    echo -en "\033]0;$BASH_COMMAND\007"; 
    fi 
}
export PROMPT_COMMAND='show_name'

This will cause your terminal's name to be the currently running command (if there is one) or your current directory if there is not. Bear in mind that this will result in a slightly schizophrenic terminal if you run a long loop that runs a command many times. Try it with while true; do echo foo; done for example.

If you are using zsh this is much easier to achieve (source) and it handles loops correctly:

case $TERM in
    xterm*)
      preexec () {
        print -Pn "\e]0;$*\a"
      }
    ;;
esac
Related Question