去掉终端命令提示符中的工作目录路径

在深层文件夹结构中使用终端时,有时提示符会占据大部分行。有没有办法缩短工作目录的显示?我知道可以这样做:
PS1="\W >"

仅打印当前目录而不是完整路径,但是否有类似以下的方式:
/home/smauel/de...ther/folder >
10个回答

如果你正在使用bash4(Ubuntu 9.10及更高版本都有bash4),最简单的方法就是设置PROMPT_DIRTRIM变量。例如:
PROMPT_DIRTRIM=2

对于类似于João Pinto示例的情况(适用于较旧的bash版本,并确保路径组件永远不超过30个字符),您可以像这样做:
PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '

4PROMPT_DIRTRIM的文档可在此处找到:https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html - Ben Amos
谢谢。PROMPT_DIRTRIM完美地完成了工作,因为我只需要它是临时的。 - Sudarshan Kadam

创建一个小的Python脚本,实现所需的修剪逻辑。
示例:~/.short.pwd.py
import os
from socket import gethostname
hostname = gethostname()
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)
if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '[%s@%s:%s] ' % (username, hostname, pwd)

现在测试一下,在终端中输入:
export PROMPT_COMMAND='PS1="$(python ~/.short.pwd.py)"'

如果你对结果满意,只需将命令追加到你的~/.bashrc文件中。

不要问那么明显的问题,但是我们应该如何将命令添加到~/.bashrc呢?只需将最后一行粘贴到文件底部吗? - FloatingRock
2@FloatingRock 正确。只需将其添加到 .bashrc 文件中即可。 - tdc
太棒了!如果你编辑Python程序,它会自动更新:太好了! - N3sh
更新最后的打印...为print(...),以便在Python 3中几乎原样工作,太棒了,感谢分享! - Sean
请参阅下面的最佳答案:PROMPT_DIRTRIM。 - BaCh

另一种解决这个问题的方法是在PS1中插入一个换行符,这样工作目录和实际提示会出现在不同的行上,例如:
PS1="\w\n>"

类似于这种情况,不改变你的PS1提示符,只需在命令前加上\并按下Enter键。这将强制命令从下一行开始,使用通常为**>**的PS2提示符...(直到看到你的建议,我才想到这个方法 :)) - Peter.O

将以下内容添加到您的~/.bashrc文件的末尾。
split_pwd() {
        # Only show ellipses for directory trees -gt 3
        # Otherwise use the default pwd as the current \w replacement
        if [ $(pwd | grep -o '/' | wc -l) -gt 3 ]; then
                pwd | cut -d'/' -f1-3 | xargs -I{} echo {}"/../${PWD##*/}"
        else
                pwd
        fi
}


export PS1="\$(split_pwd) > "

承认这可能会更简洁一些,但我想试试看。
对于超过三层深的目录,预期输出。
/home/chris/../Node Projects >

预期的输出为从桌面到后退的目录。
/home/chris/Desktop > 
/home/chris >  
/home

太棒了!我只需要添加一些智能功能,将$HOME转换为"~/",并且如果$PWD在主目录下,则不将其计算为'length'的一部分。 - Michael Burr

根据Cris Sullivan的回答,但保留家目录中的~符号。
get_bash_w() {
  # Returns the same working directory that the \W bash prompt command
  echo $(pwd | sed 's@'"$HOME"'@~@')
}

split_pwd() {
  # Split pwd into the first element, elipsis (...) and the last subfolder
  # /usr/local/share/doc --> /usr/.../doc
  # ~/project/folder/subfolder --> ~/project/../subfolder
  split=2
  W=$(get_bash_w)
  if [ $(echo $W | grep -o '/' | wc -l) -gt $split ]; then
    echo $W | cut -d'/' -f1-$split | xargs -I{} echo {}"/../${W##*/}"
  else
    echo $W
  fi
}

export PS1="\$(split_pwd) > "

这里还需要导出PS1吗?看起来很棒。 - Chris Sullivan
是的,你仍然需要导出PS1,就像你在回答中详细说明的那样。我只是添加了工作目录 :-) - Manuel

只是稍微更新一下(针对Python3)并增强所选答案,以便像Linux Mint 18.3中的BASH提示符一样为提示符添加颜色
#! /usr/bin/python3

import os, getpass
from socket import gethostname

username = getpass.getuser()
hostname = gethostname()
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

if len(pwd) > 40:
    # first 10 chars+last 30 chars
    pwd = pwd[:10] + '...' + pwd[-30:] 

# Virtual environment being used? Essential not to omit!
ve = os.getenv('VIRTUAL_ENV')
venv = '(`basename \"$VIRTUAL_ENV\"`)' if ve else ''

# colours as per my current BASH Terminal: 
# username + hostname: bold green
# path and $: bold blue
print( '\[\e[;1;32m\]%s%s@%s \[\e[;1;34m\]%s $\[\e[0m\]  ' % (venv, username, hostname, pwd) )

在 BASH 终端中的颜色代码更多信息,请点击这里。可能有一些自动查找终端使用的颜色的方法,但我没有任何线索。
有了 shebang 行后,将 export 行添加到 .bashrc 中变成了:
export PROMPT_COMMAND='PS1="$(~/.local/bin/manage_prompt.py)"' # adjust path to .py file

NB1 这些 "\e" 转义码必须始终用 "\[ ... \]" 括起来,否则换行会完全混乱。

NB2 随时获取您的完整路径,只需执行

... $ pwd 

当然...

这个小的补充是在 @joão-pinto 的出色 答案 中加入了虚拟环境的名称,当你运行 workon 命令时会显示出来。
import os
from platform import node
hostname = node().split('.')[0]
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

# check for the virtualenv
ve = os.getenv('VIRTUAL_ENV')

if ve:
    venv = '(`basename \"$VIRTUAL_ENV\"`)'
else:
    venv = ''

if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '%s[%s@%s:%s] ' % (venv, username, hostname, pwd)

这是绝对必要的!如果你没有它,你会以为你的Python虚拟环境不起作用,而实际上它是正常工作的...因此,我毫不羞耻地使用这个来融入我的想法(带有颜色...)。 - mike rodent

我最喜欢这个,PS1="[\W]\\$ "

OP提到他们对此不感兴趣。 - wjandrea

这个提示会缩短除了当前行之外的所有名称。
user:/h/t/D/C/current$ 

sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}

PS1='\u:$$(eval "sps")/\W\$ '

基于迈克·罗登特的更新的进一步定制化。 这样可以通过动态方式改变显示路径的长度。
export MAXPROMPTLEN=<desired length>

它总是显示最后一个文件夹(即使其名称超过最大长度),并尝试显示第一个文件夹。
#! /usr/bin/python3

import os, getpass
from socket import gethostname

username = getpass.getuser()
hostname = gethostname()
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

# Default value for maxlen of pwd
# Use environment varibale MAXPROMPTLEN to change dynamically
MAXLEN=30
if "MAXPROMPTLEN" in os.environ:
    MAXLEN = int(os.environ["MAXPROMPTLEN"])

if len(pwd) > MAXLEN:
    # keep first and last folder
    parts = pwd.split(os.path.sep) 
    leaf = "..." + parts[-1]
    stem = os.path.sep.join(parts[:2])[:(MAXLEN-len(leaf)+1)]
    pwd = stem + leaf

# Virtual environment being used? Essential not to omit!
ve = os.getenv('VIRTUAL_ENV')
venv = '(`basename \"$VIRTUAL_ENV\"`)' if ve else ''

# colours as per my current BASH Terminal:
# username + hostname: bold green
# path and $: bold blue
print(f"\[\e[;1;32m\]{venv}{username}@{hostname} \[\e[;1;34m\]{pwd}$\[\e[0m\]")

我建议你像这样将它包含在你的.bashrc中:
# Limit the lenght of the prompt dynamically
# comment to turn off
max_prompt_len=yes
if [ "$max_prompt_len" ]; then
   MAXPROMPTLEN=30  # maxium length of prompt
   PS1="$(python3 ~/.short_pwd.py)"
fi

假设你把代码放在~/.short_pwd.py中。