Answers:
创建一个小的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
。
如果您使用的是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")]\$ '
解决该问题的另一种方法是在PS1中包括换行符,以便工作目录和实际提示出现在单独的行中,例如:
PS1="\w\n>"
将此添加到您的底部 ~/.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
@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)
基于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) > "
只是稍作更新(对于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
当然...
~/.bashrc
?只是将最后一行粘贴到文件底部吗?