tagliare la directory di lavoro del prompt dei comandi del terminale


39

Quando si utilizza il terminale in una struttura di cartelle profonda, a volte il prompt può occupare gran parte della linea. Esiste un modo per tagliare la directory di lavoro? So di poterlo fare

PS1="\W >"

per stampare solo la directory corrente e non il percorso completo, ma c'è un modo per avere qualcosa del tipo:

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

Risposte:


30

Crea un piccolo script Python che implementa la logica di taglio desiderata.

Esempio: ~/.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)

Ora provalo, da un terminale:

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

Se sei d'accordo con il risultato, aggiungi il comando al tuo ~/.bashrc.


Non per chiedere l'ovvio, ma come si aggiunge esattamente il comando al ~/.bashrc? Incollerebbe solo l'ultima riga nella parte inferiore del file?
FloatingRock

1
@FloatingRock corretto. Basta aggiungerlo al file .bashrc.
Prefisso

Questo è fantastico! Se modifichi il programma Python, si aggiorna automaticamente: dolce!
N3sh

freddo! immediatamente rubato questo.
ferdy

Aggiorna l'ultima stampa ... per stampare (...) per ottenere questo lavoro quasi com'è anche per Python 3, ottimo consiglio, grazie per averlo condiviso !!
Sean,

69

Se stai usando bash4 (Ubuntu 9.10 e più recenti hanno bash4), l'opzione più semplice è semplicemente impostare la variabile PROMPT_DIRTRIM. per esempio:

PROMPT_DIRTRIM=2

Per uno simile all'esempio di João Pinto, (che funzionerà nelle versioni bash precedenti e garantisce che il componente path non sia mai più lungo di 30 caratteri), potresti fare qualcosa del genere:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '

4
La documentazione per PROMPT_DIRTRIM è disponibile qui: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos,

11

Un altro modo per aggirare questo problema è includere un'interruzione di riga in PS1, in modo che la directory di lavoro e il prompt effettivo vengano visualizzati su righe separate, ad esempio:

PS1="\w\n>"

Simile a questo, è non modificare il prompt di PS1, ma semplicemente avviare il comando con un \ e premere Invio . Questo costringe il comando a iniziare sulla riga successiva con il prompt di PS2, che di solito è > ... (Non ci avevo pensato fino a quando non ho visto il tuo suggerimento :)
Peter.O

4

Aggiungi questo in fondo al tuo ~/.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) > "

Certo, questo potrebbe probabilmente essere più pulito, ma volevo farci un giro.

Output previsto per le directory con profondità superiore a tre livelli.

/home/chris/../Node Projects >

Output previsto per le directory dal desktop e dal retro.

/home/chris/Desktop > 
/home/chris >  
/home

Bellissimo! Ho solo bisogno di aggiungere un po 'di intelligenza per trasformare $ HOME in "~ /" e non contarlo come parte della "lunghezza" se $ PWD è nella directory home.
Michael Burr,

1

Questa piccola aggiunta all'eccellente risposta di @ joão-pinto aggiunge il nome dell'ambiente virtuale quando si esegue il workoncomando.

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)

Questo è assolutamente essenziale! Se non ce l'hai, assumerai che il tuo ambiente virtuale Python non funzioni quando lo è ... per questo motivo lo sto usando spudoratamente per incorporarlo nella mia idea (con i colori ...).
Mike Rodent,

1

Basato sulla risposta di Cris Sullivan , ma mantenendo la ~cartella 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) > "

Non hai ancora bisogno di esportare PS1 qui ?? Sembra fantastico.
Chris Sullivan il

Sì, devi comunque esportare PS1, come indicato nella risposta. Aggiungo solo la directory di lavoro :-)
Manuel

0

Questo mi piace di più, PS1="[\W]\\$ "


OP ha detto che non sono interessati a questo.
wjandrea,

0

questo prompt accorcia tutti i nomi tranne la riga corrente:

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

PS1='\u:$$(eval "sps")/\W\$ '

0

Solo per aggiornare leggermente (per Python3) e migliorare la risposta selezionata per aggiungere colori al prompt secondo un prompt di BASH (in Linux Mint 18.3 comunque):

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

Maggiori informazioni sui codici colore in un terminale BASH qui . Probabilmente c'è un modo per scoprire quali colori usa automaticamente il tuo Terminale, ma non ho idea di cosa potrebbe essere.

Con la linea shebang la exportlinea per l'inclusione in .bashrc diventa quindi:

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

NB1 questi codici di escape "\ e" devono sempre essere racchiusi tra "\ [... \]", altrimenti i ritorni di riga vengono completamente incasinati.

NB2 per ottenere il tuo percorso completo in qualsiasi momento basta andare

... $ pwd 

ovviamente...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.