Bash的提示控制功能相当静态。如果需要更多控制,可以在提示中包括变量。确保您没有关闭该promptvars
选项。
PS1='${PWD#"${PWD%/*/*}/"} \$ '
请注意单引号:变量扩展必须在显示提示时发生,而不是在PS1
定义变量时发生。
如果要对显示的内容进行更多控制,可以使用命令替换。例如,上面的代码段丢失~
了主目录的缩写。
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
这段代码很麻烦,因此PS1
您可以使用PROMPT_COMMAND
变量来运行代码进行设置HPWD
,然后在提示符下使用它,而不是将其粘贴到变量中。
PROMPT_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
由于缩短的提示仅在目录更改时更改,因此您无需在每次显示提示时都重新计算它。Bash不提供在当前目录更改上运行的挂钩,但是您可以通过覆盖及其表亲来模拟它cd
。
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac
}
PS1='$HPWD \$'
请注意PS1
,由于它是一个shell设置,而不是环境变量,因此您不需要,也不需要export 。bash PS1
设置不会被其他shell理解。
PS如果您想获得良好的交互式Shell体验,请切换到zsh,其中所有这些(%
主要扩展包括tcsh的扩展chpwd
等)都是本机功能。
PS1='%2~ %# '
PS1='\w \$'; PROMPT_DIRTRIM=2
应该为您提供bash等效功能,但这在我的系统上无法正常工作。