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


39

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

PS1="\W >"

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

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

Ответы:


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")]\$ '

4
Документацию для PROMPT_DIRTRIM можно найти здесь: gnu.org/software/bash/manual/html_node/Bash-Variables.html
— Бен Амос,

11

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

PS1="\w\n>"

Как и в этом случае, это не изменить приглашение 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)

Это абсолютно необходимо! Если у вас его нет, вы предположите, что ваша виртуальная среда 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) > "

Вам все еще не нужно экспортировать PS1 здесь ?? Выглядит отлично.
— Крис Салливан

Да, вам все еще нужно экспортировать PS1, как вы подробно изложили в своем ответе. Я просто добавляю рабочий каталог :-)
— Мануэль

0

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


ОП упомянул, что они не заинтересованы в этом.
— 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 

конечно...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.