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


16

我是bash的新手,希望我的提示显示tcsh中的内容不重要,但是经过良好的google搜索,我仍然无法执行。

我希望提示符仅包括当前目录和父目录,如下所示:

/parent/currentdir $

在tcsh中,这可以通过以下方法实现:

set prompt = "%C2 %"

但是到目前为止,在bash中,我只发现我必须解析pwd才能获得相同的输出。

有没有更简单的方法,例如:

export PS1="$(some_command) $" 

2
从理论上讲,PS1='\w \$'; PROMPT_DIRTRIM=2应该为您提供bash等效功能,但这在我的系统上无法正常工作。
Mikel

它对我完全不起作用:GNU bash,版本3.2.57(1)-发行版(x86_64-apple-darwin14)。
twalbaum 2015年

PROMPT_DIRTRIMBash 4中引入。我刚刚在WSL下在Ubuntu 16.04上进行了测试,效果很好!
Mike Branski

Answers:


18

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~ %# '

2
这应该是公认的,最受推崇的答案。
LarsH

3

获取父目录和当前目录的语法来自Munai的answer

但是,正如Gilles指出的那样,该代码仅显示.bashrc加载时的当前目录,但是当您将系统导航到其他文件夹时,它不会更改。

.bashrc文件中包含此内容会使提示自动更新到您的当前目录:

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command

1
定义是否prompt_command()应该自己做某事?不适合我 您是否想像Gilles一样prompt_command()cd&co的重新定义中使用?还是你的意思PROMPT_COMMAND='...'
LarsH

2
另外,如果$PWD包含空格,此命令将失败。
LarsH

1
谢谢您让我回到这一点。引用$ PWD以允许有空格,并包含最终命令。我当前的提示比这要复杂得多,因此需要hint_command定义。否则,PS1 = ...会继续工作。
twalbaum

导航到时清理输出的任何想法/?按照书面规定,您将获得/// $
ezrock

0

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

现在,启动您的bash外壳。

vi ~/.bashrc

在文件中附加PS1定义

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

更多教程 这里这里有,可以帮助您进行更多调整。


1
我了解如何修改提示。我的问题是如何只获取当前目录和父目录,而不是整个路径。
twalbaum 2015年

@twalbaum编辑了我的答案
Munai Das Udasin

很高兴帮助@twalbaum :)
Munai Das Udasin

1
.bashrc会将提示设置为在加载时的当前目录,如果您cd进入另一个目录,则提示不会更改!@twalbaum
吉尔斯(Gilles)'所以,别再邪恶了'

@Gilles对我有用。
twalbaum 2015年

0

对于主目录,可能更简单,带有“〜”。

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}

0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.