Set screen-title from shellscript

BashTitleGnu ScreenXterm

Bash Problem Overview


Is it possible to set the Screen Title using a shell script?

I thought about something like sending the key commands ctrl+A shift-A Name enter

I searched for about an hour on how to emulate keystrokes in an shell script, but didn't find the answer.

Bash Solutions


Solution 1 - Bash

You can set the screen / xterm title using the following lines:

#!/bin/bash

mytitle="Some title"
echo -e '\033k'$mytitle'\033\\'

[UPDATE] - by request I'm also including the solution proposed by @Espo below:

Depending on your xterm version or your linux distribution the line above may or may not work and you can try the xterm-defaults:

#!/bin/bash

mytitle="Some title"
echo -e '\033]2;'$mytitle'\007'

For more on the details see: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3 or refer to the answer by @Espo below.

Solution 2 - Bash

From http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3

> xterm escape sequences > > Window and icon titles may be changed > in a running xterm by using XTerm > escape sequences. The following > sequences are useful in this respect: > > * ESC]0;stringBEL -- Set icon name and window title to string > * ESC]1;stringBEL -- Set icon name to string > * ESC]2;stringBEL -- Set window title to string > > where ESC is the escape character > (\033), and BEL is the bell character > (\007). > > Printing one of these sequences within > the xterm will cause the window or > icon title to be changed. > > Note: these sequences apply to most > xterm derivatives, such as nxterm, > color-xterm and rxvt. Other terminal > types often use different escapes; see > the appendix for examples. For the > full list of xterm escape sequences > see the file ctlseq2.txt, which comes > with the xterm distribution, or > xterm.seq, which comes with the rxvt > distribution. > > Printing the escape sequences > > For information that is constant > throughout the lifetime of this shell, > such as host and username, it will > suffice to simply echo the escape > string in the shell rc file: > > > echo -n "\033]0;${USER}@${HOST}\007" > > > should produce a title like > username@hostname, assuming the shell > variables $USER and $HOST are set > correctly. The required options for > echo may vary by shell (see examples > below). > > For information that may change during > the shell's lifetime, such as current > working directory, these escapes > really need to be applied every time > the prompt changes. This way the > string is updated with every command > you issue and can keep track of > information such as current working > directory, username, hostname, etc. > Some shells provide special functions > for this purpose, some don't and we > have to insert the title sequences > directly into the prompt string. This > is illustrated in the next section.

Solution 3 - Bash

The following are other ways to script the renaming of screen titles:

Adding the following settings to .ssh/config sets the screen title automatically upon logging in to a system using SSH:

Host *
  PermitLocalCommand yes
  LocalCommand [ "$TERM" == 'screen' ] && echo -ne "\033k%h\033\\" 

Instead of %h, which represents the hostname of the machine you are connecting with, you may use %n, which is the actual name / alias you used to connect to the machine.

NOTE: You need OpenSSH >= v5.1 to be able to use the Localhost %n and %h parameters. Check out 'man ssh_config' for more info on LocalCommand.

To automatically revert the title, back to that of the hostname of the localhost, after closing the SSH session, you can add an escape sequence to you prompt variable PS1 in .bashrc :

export PS1='you_favorite_PS1_here'
if [ "$TERM" == 'screen' ]; then
    export PS1=${PS1}'\[\033k\h\033\\\]'
fi

These tricks are especially useful when using a .screenrc config that shows you in what screen 'tab' you are currently working. Add something like the following to .screenrc to get this working:

caption always "%{= kY}%-w%{= Yk}%n %t%{-}%+w%{ kG} %-= @%H - %LD %d %LM - %c"

Solution 4 - Bash

Try the below commands, no need to edit any file or configuration like ~/.bashrc, Can be used at runtime.

Set static text as title: (My Title)

export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Set local/global variable as title: ($USER)

export PS1='\[\e]0;$USER\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Set command output as title: (hostname)

export PS1='\[\e]0;`hostname`\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Set to default (Revert back):

export PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Solution 5 - Bash

set_screen_title ()
{
    echo -ne "\ek$1\e\\"
}

Solution 6 - Bash

You can also call screen and tell it to set a title:

screen -X title "new title"

If you're in a screen window, it will set that window's name. If you're not in screen, it will set the most recently opened window's name.

Solution 7 - Bash

To add to Espo's answer, the xterm escape sequences can also be applied to the Bash PS1 variable

ESC]0;stringBEL -- Set icon name and window title to string
ESC]1;stringBEL -- Set icon name to string
ESC]2;stringBEL -- Set window title to string

Example

PS1='\e]0;string\a'

Solution 8 - Bash

To enable automatic title updating when jumping around with ssh, add this to ~/.bashrc:

ssh() {
  echo -n -e "\033k$1\033\\"
  /usr/bin/ssh "$@"
  echo -n -e "\033k`hostname -s`\033\\"
}
echo -n -e "\033k`hostname -s`\033\\"

See http://linuxepiphany.blogspot.com.ar/2010/05/good-screenrc-config-setup.html

Solution 9 - Bash

 # add the following in your ~/.bashrc or ~/.bash_profile
 PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

or even better copy the whole concept for customizing your bash configs between a lot of hosts from here

Solution 10 - Bash

My solution to this problem was to create a bash script and add it to my ~/.bashrc file:

set-title() {
  ORIG==$PS1
  TITLE="\e];$@\a"
  PS1=${ORIG}${TITLE}
}

Now when I'm in any bash shell session, I type "set-title desired_title" and it changes to "desired title". This works for multiple versions of Ubuntu, currently on Kinetic 16.04

I got this solution from here. I was looking for it again, couldn't find it and thought I'd post it here for anyone interested.

Solution 11 - Bash

I got this solution from experimenting with others, like @flurin-arner I started the @weston-ganger set-title(). I also used @imgx64 PROMPT_DIRTRIM suggestion. I'm also using @itseranga git branch prompt, though this has nothing to do with the question it does show what you can do with the prompt.

First as shown by weston and above

 TITLE="\[\e]2;$*\a\]"

can be used to manually set the Terminal Title, "$*" is commandline input, but not what we want.

2nd as stated I'm also adding git branch to my prompt, again not part of the question.

export PROMPT_DIRTRIM=3
parse_git_branch() {
       git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
     }

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

3rd, by experiment I copied the TITLE code above, set the $* to a fixed string and tried this:

see: \[\e]2;'SomeTitleString'\a\]

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;'SomeTitleString'\a\] $ "

This had the desired effect! Ultimately, I wanted the base path as my title. PS1 Params shows that \W is the base path so my solution is this:

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;\W\a\] $ "

without the git branch:

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\[\033[00m\]\[\e]2;\W\a\] $ "

resulting in a prompt with git-branch:

user@host ~/.../StudyJava (master) $  

resulting in a prompt without parse_git_branch:

   user@host ~/.../StudyJava $  

where pwd gives

/home/user/somedir1/otherdir2/StudyJava

and Terminal Title

StudyJava

NOTE: From @seff above I am essentially replacing the "My Title" with "\W"

export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Solution 12 - Bash

I tried this on Ubuntu 18.10 and it only worked with PROMPT_COMMAND in ~/.bashrc. And if you override PROMPT_COMMAND, the behavior of the title changes slightly. I decided to change only if necessary:

t() {
  TITLE="$@"
  PROMPT_COMMAND='echo -ne "\033]0;${TITLE}\007"'
}

enter image description here

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBeerweasleView Question on Stackoverflow
Solution 1 - BashShirkrinView Answer on Stackoverflow
Solution 2 - BashEspoView Answer on Stackoverflow
Solution 3 - BashJohnny HalfmoonView Answer on Stackoverflow
Solution 4 - BashSeffView Answer on Stackoverflow
Solution 5 - BashRandy ProctorView Answer on Stackoverflow
Solution 6 - BashidbriiView Answer on Stackoverflow
Solution 7 - BashZomboView Answer on Stackoverflow
Solution 8 - Bashmijhael3000View Answer on Stackoverflow
Solution 9 - BashYordan GeorgievView Answer on Stackoverflow
Solution 10 - BashFlurin ArnerView Answer on Stackoverflow
Solution 11 - BashmancocapacView Answer on Stackoverflow
Solution 12 - BashHoxzView Answer on Stackoverflow