обріжте робочий каталог командного рядка терміналу


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, вона автоматично оновлюється: солодко!
N3sh

круто! негайно вкрав це.
Ферді

Оновіть цей останній друк ... щоб надрукувати (...), щоб ця робота була майже такою самою, як і для python 3, чудова порада, дякую за спільний доступ !!
Шон

69

Якщо ви використовуєте bash4 (Ubuntu 9.10 і новіший має bash4), найпростіший варіант - просто встановити змінну PROMPT_DIRTRIM. наприклад:

PROMPT_DIRTRIM=2

Для одного подібного прикладу Жоао Пінто (який буде працювати у старих версіях bash та гарантує, що компонент шляху ніколи не перевищує 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>"

Як і у Thiis, полягає в тому, щоб не змінювати підказку 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 у "~ /", а не рахувати це як частину "length", якщо $ 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

На основі відповіді Кріс Салліван , але зберігаючи ~домашню папку

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

це підказка скорочує всі імена, крім поточного рядка цього:

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 

звичайно...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.