przyciąć katalog roboczy wiersza poleceń terminala

39

Podczas korzystania z terminala w głębokiej strukturze folderów czasami monit może zająć większą część wiersza. Czy jest jakiś sposób na przycięcie katalogu roboczego? Wiem, że mogę

PS1="\W >"

aby wydrukować tylko bieżący katalog, a nie pełną ścieżkę, ale czy istnieje sposób na coś takiego:

/home/smauel/de...ther/folder >
smauel
źródło

Odpowiedzi:

30

Utwórz mały skrypt Pythona, który implementuje pożądaną logikę przycinania.

Przykład: ~/.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)

Teraz przetestuj z poziomu terminalu:

export PROMPT_COMMAND='PS1="$(python ~/.short.pwd.py)"'

Jeśli zgadzasz się z wynikiem, po prostu dodaj polecenie do swojego ~/.bashrc.

João Pinto
źródło
Nie pytając o oczywiste, ale jak dokładnie dołączyć polecenie do ~/.bashrc? Czy po prostu wkleiłby ten ostatni wiersz na dole pliku?
FloatingRock
1
@ FloatingRock poprawne. Po prostu dodaj go do pliku .bashrc.
Prefiks
To jest świetne! Jeśli edytujesz program python, automatycznie się aktualizuje: słodki!
N3sh,
fajne! natychmiast to ukradłem.
ferdy
Zaktualizuj ten ostatni wydruk ..., aby wydrukować (...), aby uzyskać prawie taką samą pracę w Pythonie 3, świetna wskazówka, dziękuję za udostępnienie !!
Sean
69

Jeśli używasz bash4 (Ubuntu 9.10 i nowsze mają bash4), najłatwiejszą opcją jest ustawienie zmiennej PROMPT_DIRTRIM. na przykład:

PROMPT_DIRTRIM=2

Na przykład podobny do przykładu João Pinto (który będzie działał w starszych wersjach bash i zapewni, że składnik ścieżki nigdy nie będzie dłuższy niż 30 znaków), możesz zrobić coś takiego:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '
geirha
źródło
4
Dokumentację dla PROMPT_DIRTRIM można znaleźć tutaj: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos
11

Innym sposobem obejścia tego problemu jest włączenie podziału wiersza do PS1, tak aby katalog roboczy i rzeczywisty monit pojawiały się w osobnych wierszach, na przykład:

PS1="\w\n>"
ak2
źródło
Podobnie jak w tym przypadku, nie należy zmieniać monitu PS1, ale po prostu uruchomić polecenie za pomocą \ i nacisnąć Enter . Zmusza to polecenie do rozpoczęcia następnego wiersza od monitu PS2, który zwykle jest > ... (nie myślałem o tym, dopóki nie zobaczyłem twojej sugestii :)
Peter.O
4

Dodaj to na dole swojego ~/.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) > "

Trzeba przyznać, że to może być czystsze, ale chciałem się na tym zgodzić.

Oczekiwany wynik dla katalogów głębszych niż trzy warstwy.

/home/chris/../Node Projects >

Oczekiwany wynik dla katalogów z pulpitu iz powrotem.

/home/chris/Desktop > 
/home/chris >  
/home
Chris Sullivan
źródło
Piękny! Muszę tylko dodać trochę mądrości na temat przekształcania $ HOME na „~ /” i nie licząc tego jako części „długości”, jeśli $ PWD znajduje się w katalogu domowym.
Michael Burr,
1

Ten niewielki dodatek do doskonałej odpowiedzi @ joão-pinto dodaje nazwę środowiska wirtualnego po uruchomieniu workonpolecenia.

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
źródło
Ach, fajny pomysł ... może połączyć się z moimi kodami kolorystycznymi?
Mike gryzoni
1

Na podstawie odpowiedzi Crisa Sullivana , ale zachowując ~folder domowy

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
źródło
Czy nadal nie musisz tutaj eksportować PS1? Wygląda świetnie.
Chris Sullivan
Tak, nadal musisz wyeksportować PS1, jak opisano szczegółowo w odpowiedzi. Właśnie dodałem katalog roboczy :-)
Manuel
0

Ten najbardziej mi się podoba, PS1="[\W]\\$ "

Medya
źródło
OP wspomniał, że nie są w to zaangażowani.
wjandrea,
0

ten monit skraca wszystkie nazwy oprócz bieżącego wiersza to:

user:/h/t/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}

PS1='\u:$$(eval "sps")/\W\$ '
Travis S.
źródło
0

Wystarczy nieznacznie zaktualizować (dla Python3) i ulepszyć wybraną odpowiedź, aby dodać kolory do pytania zgodnie z poleceniem BASH (w Linux Mint 18.3 i tak):

#! /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) )

Więcej informacji o kodach kolorów w terminalu BASH tutaj . Prawdopodobnie jest jakiś sposób, aby dowiedzieć się, jakie kolory automatycznie używa terminal, ale nie mam pojęcia, co to może być.

Z linią shebang linia exportdo włączenia do .bashrc staje się:

export PROMPT_COMMAND='PS1="$(~/.local/bin/manage_prompt.py)"' # adjust path to .py file

NB1 te kody ucieczki „\ e” muszą zawsze być ujęte w „\ [... \]”, w przeciwnym razie znaki końca linii zostaną całkowicie pomieszane.

NB2, aby uzyskać pełną ścieżkę w dowolnym momencie, po prostu idź

... $ pwd 

oczywiście...

gryzoń mike
źródło