Ao tentar encontrar uma maneira de obter um prompt bonito no POSIX sh, encontrei duas limitações da implementação sh do PS1 que eu tive que hackear:
-
Embora o
\w
noPS1
var funcione, ele não expande$HOME
para~
-
Embora você possa usar
PS1
para atualizar o prompt no terminal, não parece possível atualizar o título do xterm usando a variávelPS1
. Os caracteresESC
eBEL
não conseguem definir o título como seria de esperar se estivessem usando bash ou ksh
Aqui foi o resultado final, funciona muito bem. Ele precisa ser adicionado ao seu arquivo .shrc (certifique-se de que o PS1 não esteja definido primeiro):
update_prompt() {
case "$PWD" in
"$HOME"*)
pretty_pwd="~${PWD#*"${HOME}"}"
;;
"/usr$HOME"*)
pretty_pwd="~${PWD#*"/usr${HOME}"}"
;;
*)
pretty_pwd="$PWD"
;;
esac
case "$TERM" in
xterm*|rxvt*)
PS1="($USER@\h $pretty_pwd)\$ "
;;
*)
;;
esac
printf "\033]0;(%s@$(hostname -s): %s)\007" "$USER" "$pretty_pwd"
}
update_prompt
cd() {
command cd "$@" && update_prompt
}
Observe que o prompt será colocado entre parênteses. Este é apenas um lembrete pessoal para mim mesmo de que estou no FreeBSD e não no Ubuntu. Se você preferir um prompt com aparência mais tradicional, use isso:
update_prompt() {
case "$PWD" in
"$HOME"*)
pretty_pwd="~${PWD#*"${HOME}"}"
;;
"/usr$HOME"*)
pretty_pwd="~${PWD#*"/usr${HOME}"}"
;;
*)
pretty_pwd="$PWD"
;;
esac
case "$TERM" in
xterm*|rxvt*)
PS1="$USER@\h $pretty_pwd\$ "
;;
*)
;;
esac
printf "\033]0;%s@$(hostname -s): %s\007" "$USER" "$pretty_pwd"
}
update_prompt
cd() {
command cd "$@" && update_prompt
}
Você provavelmente deseja remover a condição "/usr$HOME"*)
se estiver no Linux. Não serve para nada, a menos que você esteja no FreeBSD, onde /home
é tipicamente um link simbólico para /usr/home
.