在bash提示符下仅显示当前目录名称(不是完整路径)


71

我的bash提示符当前的配置方式,它显示了当前目录的完整路径。当我深入目录树时,这很烦人,因为提示变得很长,以至于每个命令都绕到下一行。如何使其仅显示路径的最后一部分?

这就是我的.bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac

Answers:


98

\w(小写)更改为\W(大写):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
                                                                                       ^^
           this one waaaaaay over here ------------------------------------------------+    

查看Bash Prompt HOWTO,了解许多有趣的细节。例:

user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

PROMPT_COMMAND变量(如果已设置)是在显示中指定的提示之前运行的命令PS1。在你的情况下,PROMPT_COMMAND运行的echo某些语句ANSI转义序列操纵的xterm的标题栏

如果您怀疑自己PROMPT_COMMAND覆盖了PS1提示符,则可以进行unset测试:

$ unset PROMPT_COMMAND

最后,请确保您正在更改PS1实际使用的定义。常见的位置是/etc/bash.bashrc/etc/profile~/.bashrc~/.bash_profile~/.profile。系统文件通常(但不总是)在用户文件之前运行。


嗯...恐怕已经是\ w,但是case当我在xterm上时,该语句似乎覆盖了它,问题似乎PWDPROMPT_COMMAND在行中。你知道我应该放在那里吗?
hsribei

4
\w(小写)将其设置为完整路径,\W(大写)将修剪为最后一位。PROMPT_COMMAND正在xterm中设置窗口标题。检查您的TERM变量;如果它不是以“ xterm”或“ rxvt” 开头,则PROMPT_COMMAND甚至无法运行。
2009年

哦,是的 抱歉,我混合使用大写和小写字母。那行得通。谢谢!:)
hsribei

好答案。确保重新启动才能生效。谢谢!
合并

14

简单的bash替换命令是

${VAR/pattern_to_find/pattern_to_replace}

要显示最后一个目录,您只需执行即可${PWD/*\//},即在最后一个“ /” 之前(包括最后一个“ ”)查找任何东西,然后将其替换为空。

在我的ubuntu机器上,我使用:

export PS1='$(whoami):${PWD/*\//}#'. 

1
我喜欢这个答案,而不是接受这个答案,因为它在任何情况下都是通用的,而不仅仅是$ PS1的特殊解析逻辑。更少的更强大的工具更容易记住和编写。:)
David Ellis

4

我的解决方案是在目录超过5个时显示前三个目录和后两个目录

所以我的提示(也有其他信息)如下所示:

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote

当我的密码实际上是

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote

我的PS1提示设置如下:

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

git_branch 是一个显示当前git分支的函数,我将其保存在我的dotfiles中,它是:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }

这太棒了!非常感谢您的回答。
卡洛斯F

4

我的解决方案在如何导出方面略有不同,因此我想在这里分享:

创建另一个提示字符串变量;PS5并在.profile/ .bash_profile文件中导出以下字符串:

\ u:显示当前用户名。

\ W:打印当前工作目录的基础。

# Display username and current directory only.
export PS5='export PS1="\u:\W$";';

现在,每当您需要使用速记PS时,只需运行: eval $PS5


甚至更好的是,在.bash_aliases文件中创建一个别名:(感谢@muru

alias PS5='export PS1="\u:\W$";';

source再次,现在您只需键入PS5即可切换。


1
这看起来像是一个乳香。为什么不只使用别名或函数?
muru

1

在bash提示符下仅显示当前目录名称(不是完整路径)

在共享点文件的所有操作系统上,大多数其他解决方案均不适用于我:AIX,Windoze和Linux。bash的端口是在不支持某些构造旧版本,我不希望到餐桌的另一过程(即sedawk等等),这是在Cygwin的显着昂贵。

以下内容很长,但性能出色:

# takes a number argument of the number of last dirs to show
function DIR_LAST {
    # read -a didn't seem to work under bash 3
    IFS='/' array=($PWD)
    len=${#array[@]}
    start=$((len - $1))
    # leading / if fewer dir args: /usr/flastname not usr/flastname
    if (( $start <= 1 )); then
        start=1
        echo -n /
    fi
    for (( i = $start; $i < $len; i++ )); do
        if (( $i > $start )); then
            echo -n /
        fi
        echo -n ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

我希望它吐出来:

/
/usr
/usr/foo
foo/bin

请注意,最后一行缺少前导斜线,这就是我喜欢的方式。另外,您可以通过将arg更改为吐出最后3个目录DIR_LAST

另外,我尝试使用正则表达式执行此操作,BASH_REMATCH但是bash v3似乎不喜欢parens,而且我不知道如何正确地对其进行转义。叹。


0

我相信,只需执行以下操作,此选项就会容易得多:

echo $PWD | rev | cut -d '/' -f 1 | rev

因此,将其分配给您的.bashrc文件中的PS1变量:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'

0
root:~/project#  -> root:~/project(dev)# 

将以下代码添加到〜/ .bashrc的末尾

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
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.