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

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

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

答案1

\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 提示符操作指南有很多有趣的细节。例如:

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

答案2

简单的 bash 替换命令是

${VAR/pattern_to_find/pattern_to_replace}

为了显示最后一个目录,您只需执行${PWD/*\//},即找到最后一个“ ”之前的任何内容(包括最后一个“ /”)并将其替换为任何内容。

在我的 ubuntu 机器上我使用:

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

答案3

我的解决方案是,当目录超过 5 个时,显示前 3 个和后 2 个目录

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

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 分支的函数,我将其保存在我的点文件中,它是:

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

答案4

我相信这个选项更容易,只需执行以下操作:

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

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

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

相关内容