我是 bash 的新手,希望我的提示显示一些在 tcsh 中微不足道的东西,但经过良好的 google 搜索后我仍然无法做到。
我希望我的提示仅包含当前目录和父目录,如下所示:
/parent/currentdir $
在 tcsh 中,这是通过以下方式实现的:
set prompt = "%C2 %"
然而到目前为止,在 bash 中我只发现我必须解析 pwd 才能获得相同的输出。
难道没有更简单的方法吗,比如:
export PS1="$(some_command) $"
答案1
巴什的及时控制特征是相当静态的。如果您想要更多控制,您可以在提示中包含变量;确保您没有关闭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 设置,而不是环境变量。PS1
其他 shell 无法理解bash设置。
PS 如果您想要良好的交互式 shell 体验,请切换到桀骜,其中所有这些(提示%
扩展主要包含 tcshchpwd
等)都是本机功能。
PS1='%2~ %# '
答案2
设置PROMPT_DIRTRIM=2
应该是您所需要的。
答案3
答案4
添加export PROMPT_DIRTRIM=2
到您的 bash 文件将为最新版本的 bash (v. 4+) 执行此操作。具体来说,这会将环境变量\w
中条目的外观PS1
从完整路径更改为最后两个条目。
最终结果看起来像../Documents/MyFolder