After switching to using .bashrc instead of .bash_profile (I didn't like how the default terminal worked with one config file and utilities like screen with another), the behavior of iterm2 changed. Before, when I set the tab titles manually, they would remain there unless I ssh'd into another server, at which point the title would change to username@otherservername: /location/in/other/servers/filesystem. Now, when I change the tab titles, they remain so until the first command I execute in that tab. As soon as I run something, the tab title switches to myusername@mymacname: /my/location/in/my/mac/filesystem.

Using the command line argument, echo -ne "\e]1;tab title\a" doesn't help. It does switch (Slow enough to notice the title change on the screen), but when the command exits, the title is back where it used to be: myusername@mymacname: /my/location/in/my/mac/filesystem.

Ideally, I would like the tab titles to NEVER switch automatically, including when I ssh into another server. If that's not possible, I'd like to return to the previous behavior: as long as I'm on the local machine, keep the tab titles I set. Can that be done?

Here's my .bashrc file:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# don't put duplicate lines in the history. See bash(1) for more options
# don't overwrite GNU Midnight Commander's setting of `ignorespace'.
# ... or force ignoredups and ignorespace
export HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;36m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

#if [ -f ~/.bash_aliases ]; then
#    . ~/.bash_aliases

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    eval "`dircolors -b`"
    alias ls='ls --color=auto -hF'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    #alias grep='grep --color=auto'
    #alias fgrep='fgrep --color=auto'
    #alias egrep='egrep --color=auto'

# some more ls aliases
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
source ~/.local/bin/bashmarks.sh

export PATH=/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin:$HOME/bin:$PATH
export MANPATH=/opt/local/man:$MANPATH
export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

Go to Iterm's Preferences > Profiles > Terminal

Uncheck "Terminal may set tab/window title"

Now you can name your tab, ssh into a server, exit and still keep the original tab name.

Credit to: https://groups.google.com/forum/#!topic/iterm2-discuss/czV-sv4ykzI

Cheers, Alan

| improve this answer | |

Make sure $PROMPT_COMMAND is not set by running


If the output is non-empty, that script is executed just before a prompt is displayed by the shell.

On OS X Lion, the default value is update_terminal_cwd, and it looks like this:

$ type update_terminal_cwd
update_terminal_cwd is a function
update_terminal_cwd () 
    local SEARCH=' ';
    local REPLACE='%20';
    local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}";
    printf '\e]7;%s\a' "$PWD_URL"

It is used to add the current working directory to Terminal's title bar.

| improve this answer | |

To prevent hosts you ssh into from changing the title, usually doing

export TERM=vt100

before you ssh does the trick, because the default initialization files (bashrc etc) look at the terminal variable and only change the title if the terminal is xterm (which nowadays is the de facto standard).

Note: with this trick you lose at least "alternate screen", colors and maybe other kinds of fancy terminal features you may or may not appreciate.

| improve this answer | |
  • Not only can I finally keep my tabs named properly, I no longer have to start each ssh session with unalias -a anymore to avoid colors. – CodeReaper May 20 '15 at 12:43

Found (partially) an answer. If this portion is commented out:

# If this is an xterm set the title to user@host:dir
case "$TERM" in
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"


# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
#    ;;
#    ;;

The tab titles are preserved as long as you're on the local machine. The server still changes them.

| improve this answer | |
  • 1
    Look into the remote machine's default PS1: Enter echo $PS1 on the command line to view it, enter PS1='\$' to set it to a minimal value for testing whether that setting is responsible for changing your window title. – Daniel Beck Nov 10 '11 at 20:34

Thanks to everyone here. I FINALLY figured out what I needed to.

  1. Just having local tab names kept is useless for me because I'm specifically dealing with ssh into boxes.

  2. I use colors in my terminal and I don't want to disable colors as Viljo's solution would do.

Specifically, I'm running multiple vagrant boxes on my local machine and I keep tabs open to several of them. I want to easily set the tab name to the OS version of the vagrant box, and have it stay that way. I keep the tabs open for a long time, so I don't mind setting the name manually, but it needs to not be reset back automatically.

Also, since these are vagrant boxes, I don't want to change settings on them that I will have to change again later if I vagrant destroy.

So, my findings:

On CentOS 6, the tabname updating code gets placed in $PROMPTNAME. It can be neutralized and the tabname set in one command by running:

PROMPT_COMMAND="" && printf '\e]1;%s\a' "CentOS 6.6"

On Ubuntu, the tabname updating code is directly in $PS1; it gets prepended to the already set value of $PS1 by ~/.bashrc. This can be reverted and the tabname set in one command by running:

PS1="${PS1##*\}}" && printf '\e]1;%s\a' "Ubuntu 14.04"
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.