Обрезать рабочий каталог командной строки терминала
При использовании терминала в глубокой структуре папок иногда приглашение может занимать большую часть строки. Есть ли способ, которым я могу обрезать рабочий каталог? Я знаю, что могу сделать
PS1="\W >"
распечатать только текущий каталог, а не полный путь, но есть ли способ получить что-то вроде:
/home/smauel/de...ther/folder >
10 ответов
Создайте небольшой скрипт на 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
Для примера, аналогичного примеру Жоао Пинту (который будет работать в старых версиях 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
Основываясь на ответе Криса Салливана, но сохраняя ~
для домашней папки
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:]
# 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 здесь. Возможно, есть какой-то способ узнать, какие цвета использует ваш терминал, но я не знаю, что это может быть.
С линией Шебанга export
строка для включения в.bashrc становится:
export PROMPT_COMMAND='PS1="$(~/.local/bin/manage_prompt.py)"' # adjust path to .py file
ВНИМАНИЕ, эти escape-коды "\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)
Это приглашение сокращает все имена, кроме текущей строки:
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