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

age*_*ser 113 linux bash command-line bashrc

我的 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
Run Code Online (Sandbox Code Playgroud)

qua*_*ote 148

\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 ------------------------------------------------+    
Run Code Online (Sandbox Code Playgroud)

查看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$
Run Code Online (Sandbox Code Playgroud)

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

如果您怀疑您PROMPT_COMMANDPS1提示覆盖了您的提示,您可以unset对其进行测试:

$ unset PROMPT_COMMAND
Run Code Online (Sandbox Code Playgroud)

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

  • `\w`(小写)将其设置为完整路径,`\W`(大写)修剪到最后一位。PROMPT_COMMAND 在 xterm 中设置窗口标题。检查您的 TERM 变量;如果它不以“xterm”或“rxvt”*开始*,则 PROMPT_COMMAND 甚至不会运行。 (4认同)

小智 27

简单的 bash 替换命令是

${VAR/pattern_to_find/pattern_to_replace}
Run Code Online (Sandbox Code Playgroud)

为了显示最后一个目录,您可以只做${PWD/*\//},即在包括最后一个“ /”之前找到任何内容并将其替换为空。

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

export PS1='$(whoami):${PWD/*\//}#'. 
Run Code Online (Sandbox Code Playgroud)


Mic*_*ant 8

我的解决办法是当超过5个目录时显示前三个和后2个目录

所以我的提示(也有其他信息)看起来像:

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote
Run Code Online (Sandbox Code Playgroud)

当我的密码实际上是

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote
Run Code Online (Sandbox Code Playgroud)

我的 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
Run Code Online (Sandbox Code Playgroud)

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

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