修剪终端命令提示符工作目录


39

在深层文件夹结构中使用终端时,有时提示会占用大部分行。有什么方法可以修剪工作目录?我知道我能做

PS1="\W >"

只打印当前目录而不是完整路径,但是有一种类似的方法:

/home/smauel/de...ther/folder >

Answers:


30

创建一个小的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

1
@FloatingRock正确。只需将其添加到.bashrc文件即可。
前缀

这很棒!如果您编辑python程序,它将自动更新:甜!
N3sh 2015年

凉!立即偷了这个。
ferdy

将最后一个打印...更新为print(...)也可以使python 3的工作保持原样,很好的提示,谢谢分享!!
肖恩

69

如果您使用的是bash4(Ubuntu 9.10及更高版本具有bash4),最简单的选择是仅设置PROMPT_DIRTRIM变量。例如:

PROMPT_DIRTRIM=2

对于类似于JoãoPinto的示例(可以在较早的bash版本中使用,并确保path组件的长度不能超过30个字符),您可以执行以下操作:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '

4
可以在以下位置找到PROMPT_DIRTRIM的文档:gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos,

11

解决该问题的另一种方法是在PS1中包括换行符,以便工作目录和实际提示出现在单独的行中,例如:

PS1="\w\n>"

与thiis类似,是不更改PS1提示符,而只是使用\启动命令并按Enter即可。这会强制命令从PS2提示符的下一行开始,通常是> ...(直到看到您的建议我才想到它:)
Peter.O 2010年

4

将此添加到您的底部 ~/.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位于主目录下,则不将其计为“长度”的一部分。
迈克尔·伯

1

@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)

啊,好主意...也许和我的着色代码结合在一起?
麦克·啮齿动物

1

基于Cris Sullivan的回答,但保留~home文件夹的

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吗?看起来很棒。
克里斯·沙利文

是的,您仍然需要导出PS1,如答案中所述。我只添加工作目录:-)
Manuel


0

此提示会缩短除当前行以外的所有名称,即:

user:/h/t/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}

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

0

只是稍作更新(对于Python3)并增强选择的答案即可按照BASH提示向提示添加颜色(无论如何在Linux Mint 18.3中):

#! /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:] 

# colours as per my current BASH Terminal: 
# username + hostname: bold green
# path and $: bold blue
print( '\[\e[;1;32m\]%s@%s \[\e[;1;34m\]%s $\[\e[0m\]  ' % (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 

当然...

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.