在 bash 提示符中仅显示当前目录和父目录

在 bash 提示符中仅显示当前目录和父目录

我是 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

bash通过编辑 shell 变量可以轻松更改提示字符串PS1。它代表提示字符串 1。更多信息这里

现在启动你的bashshell。

vi ~/.bashrc

在文件中附加 PS1 定义

`export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"`

更多教程这里这里,帮助您进一步调整它。

答案4

添加export PROMPT_DIRTRIM=2到您的 bash 文件将为最新版本的 bash (v. 4+) 执行此操作。具体来说,这会将环境变量\w中条目的外观PS1从完整路径更改为最后两个条目。

最终结果看起来像../Documents/MyFolder

相关内容