我是bash的新手,希望我的提示显示tcsh中的内容不重要,但是经过良好的google搜索,我仍然无法执行。
我希望提示符仅包括当前目录和父目录,如下所示:
/parent/currentdir $
在tcsh中,这可以通过以下方法实现:
set prompt = "%C2 %"
但是到目前为止,在bash中,我仅发现必须解析pwd才能获得相同的输出。
有没有更简单的方法,例如:
export PS1="$(some_command) $"
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 。bashPS1
设置不会被其他shell理解。
PS如果您希望获得良好的交互式Shell体验,请切换到zsh,其中所有这些(%
主要扩展包括tcsh的扩展chpwd
,等等)都是本机功能。
PS1='%2~ %# '
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句