Примеры для различных оболочек

Ниже представлены примеры для большинства оболочек - начиная с zsh, который предоставляет для этого специальные средства, и далее в порядке увеличения сложности.

Чтобы убедиться в том, что мы находимся в xterm, мы проверяем переменную $TERM на предмет $TERM=xterm*; шаблон необходим, потому что в некоторых случаях (например для rxvt) она может быть установлена $TERM=xterm-color.

Заметим также, что в производных C-shell, таких как tcsh и csh, неопределенные переменные вызывают фатальную ошибку. Таким образом, перед тем как проверить содержимое переменной $TERM, мы должны проверить ее наличие. Чтобы добиться этого, мы должны использовать:
  if ($?TERM) then
      ...
  endif
(По нашему мнению, это одна из причин, почему не надо использовать C-shell. См. Csh Programming Considered Harmful).

Эти примеры можно использовать: просто вставьте их в соответствующий файл инициализации, выполняемый во время запуска интерактивной оболочки. В большинстве случаев он выглядит, примерно как .shellrc (например .zshrc, .tcshrc и т.д.).

zsh

zsh предоставляет несколько функций и расширений, которые мы будем использовать:
precmd ()   функция, выполняемая перед выводом каждого приглашения
chpwd ()    функция, выполняемая после смены текущего каталога
\e          escape-последовательность для символа ESC
\a          escape-последовательность для символа BEL
%n          $USERNAME
%m          имя машины до первой '.'
%~          путь к текущему каталогу, начиная с домашнего
Существует также много других расширений man zshmisc.

Таким образом, следующее меняет заголовок XTerm на "имя_пользователя@имя_машины: каталог":
case $TERM in
    xterm*)
        precmd () {print -Pn "\e]0;%n@%m: %~\a"}
        ;;
esac
То же самое достигается использованием chpwd() вместо precmd(). Встроенная команда print работает так же, как и echo, но обеспечивает доступ к %-командам.

tcsh

tcsh обладает похожими функциями:
precmd ()   функция, выполняемая перед выводом каждого приглашения
cwdcmd ()   функция, выполняемая после смены текущего каталога
%n          имя пользователя
%m          имя машины
%~          путь к текущему каталогу, начиная с домашнего
%#	    '%' для обычных пользователей, '#' для root'а
%{...%}     включает строчку как последовательность escape-сиволов

К сожалению, у tcsh нет аналога zsh-команды print, так что нам придется пользоваться обычными переменными. Для ˜/.tcshrc):
switch ($TERM)
    case "xterm*":
        alias precmd 'echo -n "\033]0;${HOST}:$cwd\007"'
        breaksw
endsw
Тем не менее, это дает нам полный путь к текущему каталогу, а не через ˜. Вместо этого в приглашение можно поместить свою строку:
switch ($TERM)
    case "xterm*":
        set prompt="%{\033]0;%n@%m:%~\007%}tcsh%# "
        breaksw
    default:
        set prompt="tcsh%# "
        breaksw
endsw
которая устанавливает приглашение "tcsh% ", а в xterm устанавливает заголовок "имя_пользователя@имя_машины: каталог". Заметим, что вокруг escape-последовательности стоят символы "%{...%}" (приглашение не должно заканчиваться этим: man tcsh).

bash

bash поддерживает переменную $PROMPT_COMMAND, содержащую команду, запускаемую перед выводом приглашения. Этот пример устанавливает заголовок окна имя_пользователя@имя_машины: каталог:
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
где \033 - код символа ESC, а \007 - BEL.

Заметим, что кавычки здесь очень важны: значения переменных вставляются в "...", и не вставляются в '...'. Так что переменная $PROMPT_COMMAND устанавливается без подстановки переменных, которая происходит во время выполнения $PROMPT_COMMAND.

Тем не менее, $PWD дает полный путь к каталогу. Если вы хотите, чтобы он начинался с ˜, можете воспользоваться следующими расширениями:
\u          $USERNAME
\h          имя машины до первой '.'
\w          каталог, начиная с '~'
\$	    '$' для обычных пользователей, '#' для root
\[...\]     вставляет последовательность непечатаемых символов

Таким образом, следующее устанавливает приглашение bash$, а в заголовке XTerm имя_пользователя@имя_машины: каталог:
case $TERM in
    xterm*)
        PS1="\[\033]0;\u@\h: \w\007\]bash\\$ "
        ;;
    *)
        PS1="bash\\$ "
        ;;
esac
Замечу, что используется последовательность \[...\], которая говорит bash, во время вычисления ширины приглашения игнорировать символы, содержащиеся внутри. Иначе могут возникнуть проблемы с позиционированием курсора во время редактирования строки.

ksh

ksh дает не много возможностей для наших целей, так что нам придется вставить escape-последовательности прямо в приглашение. Следующий пример устанавливает заголовок окна имя_пользователя@имя_машины: каталог и приглашение ksh$.
case $TERM in
    xterm*)
        HOST=`hostname`
        PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
        ;;
    *)
        PS1='ksh$ '
        ;;
esac
$PWD выдает полный путь к каталогу. При помощи ${...##...} мы можем убрать префикс $HOME/ из каталога. Можно также укоротить имя машины через ${...%%...}:
HOST=`hostname`
HOST=${HOST%%.*}
PS1='^[]0;${USER}@${HOST}: ${PWD##${HOME}/}^Gksh$ '
Заметим, что ^[ и ^G в строке приглашения - это просто символы ESC и BEL (они могут быть введены в emacs при помощи C-q ESC и C-q C-g).

csh

В csh это все достаточно сложно:
switch ($TERM)
    case "xterm*":
        set host=`hostname`
        alias cd 'cd \!*; echo -n "^[]0;${user}@${host}: ${cwd}^Gcsh% "'
        breaksw
    default:
        set prompt='csh% '
        breaksw
endsw
где мы переопределяем команду cd для того, чтобы она посылала escape-последовательности. Заметим, что ^[ и ^G - символы ESC и BEL (они могут быть введены в emacs при помощи C-q ESC и C-q C-g).

Заметим, что на некоторых системах команда hostname -s выдает короткое имя машины, вместо длинного, а некоторые пользователи могут использовать `pwd` (обратные кавычки запускают команду pwd), вместо $cwd, чтобы получить более точный путь.