Примеры для различных оболочек
Ниже представлены примеры для большинства оболочек - начиная с 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, чтобы получить более точный путь.