обрезать рабочий каталог командной строки терминала

39

При использовании терминала в глубокой структуре папок иногда приглашение может занимать большую часть строки. Есть ли способ, которым я могу обрезать рабочий каталог? Я знаю, что могу сделать

PS1="\W >"

распечатать только текущий каталог, а не полный путь, но есть ли способ получить что-то вроде:

/home/smauel/de...ther/folder >
smauel
источник

Ответы:

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, она автоматически обновляется: sweet!
N3sh
прохладный! немедленно украл это.
ferdy
Обновите эту последнюю печать ... до печати (...), чтобы получить эту работу почти как есть для python 3, отличный совет, спасибо, что поделились !!
Шон
69

Если вы используете 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")]\$ '
geirha
источник
4
Документацию для PROMPT_DIRTRIM можно найти здесь: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Бен Амос,
11

Другим способом решения этой проблемы является включение разрыва строки в PS1, чтобы рабочий каталог и фактическое приглашение отображались в отдельных строках, например:

PS1="\w\n>"
ak2
источник
Как и в этом случае, это не изменить приглашение PS1, а просто запустить команду с помощью \ и нажать Enter . Это заставляет команду начинаться на следующей строке с подсказки PS2, которая обычно > ... (я не думал об этом, пока не увидел ваше предложение :)
Peter.O
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)
Katahdin
источник
Это абсолютно необходимо! Если у вас его нет, вы предположите, что ваша виртуальная среда Python не работает, когда она есть ... по этой причине я бессовестно использую это для включения в свою идею (с цветами ...).
Майк Грызун
1

На основании ответа Криса Салливана , но с сохранением ~для домашней папки

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) > "
Manuel
источник
Вам все еще не нужно экспортировать PS1 здесь ?? Выглядит отлично.
Крис Салливан
Да, вам все еще нужно экспортировать PS1, как вы подробно изложили в своем ответе. Я просто добавляю рабочий каталог :-)
Мануэль
0

Мне больше всего нравится этот, PS1="[\W]\\$ "

Medya
источник
ОП упомянул, что они не заинтересованы в этом.
wjandrea
0

это приглашение сокращает все имена, кроме текущей строки this:

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:] 

# 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

ВНИМАНИЕ, эти escape-коды "\ e" всегда должны быть заключены в "\ [... \]", в противном случае возврат строки будет полностью испорчен.

NB2, чтобы получить полный путь в любое время

... $ pwd 

конечно...

Майк Грызун
источник