rogner le répertoire de travail de l'invite de commande du terminal

35

Lorsque vous utilisez le terminal dans une structure de dossiers détaillée, l'invite peut occuper la majeure partie de la ligne. Y a-t-il un moyen de couper le répertoire de travail? Je sais que je peux faire

PS1="\W >"

pour imprimer uniquement le répertoire en cours et non le chemin complet, mais existe-t-il un moyen d'avoir quelque chose comme:

/home/smauel/de...ther/folder >
    
posée smauel 16.12.2010 - 12:46
la source

6 réponses

26

Créez un petit script python qui implémente la logique de rognage souhaitée.

Exemple: ~/.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 '[%[email protected]%s:%s] ' % (username, hostname, pwd)

Maintenant, testez-le depuis un terminal:

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

Si vous êtes d'accord avec le résultat, ajoutez simplement la commande à votre ~/.bashrc .

    
réponse donnée João Pinto 16.12.2010 - 13:54
la source
64

Si vous utilisez bash4 (Ubuntu 9.10 et plus récent a bash4), l'option la plus simple consiste à définir simplement la variable PROMPT_DIRTRIM. par exemple:

PROMPT_DIRTRIM=2

Pour un exemple similaire à celui de João Pinto, (qui fonctionnera dans les anciennes versions de bash et garantira que le composant path ne dépasse jamais 30 caractères), vous pouvez faire quelque chose comme ceci:

PS1='[\[email protected]\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]$ '
    
réponse donnée geirha 08.03.2011 - 22:19
la source
10

Une autre solution à ce problème consiste à inclure un saut de ligne dans PS1, afin que le répertoire de travail et l'invite s'affichent sur des lignes distinctes, par exemple:

PS1="\w\n>"
    
réponse donnée ak2 16.12.2010 - 13:22
la source
2

Ajoutez ceci au bas de votre ~/.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) > "

J'admets que cela pourrait probablement être plus propre, mais je voulais me faire une idée.

Résultats attendus pour les répertoires de plus de trois couches.

/home/chris/../Node Projects >

Résultats attendus pour les répertoires du bureau et de l’arrière.

/home/chris/Desktop > 
/home/chris >  
/home
    
réponse donnée Chris Sullivan 06.01.2017 - 08:12
la source
0

J'aime plus celui-ci, PS1="[\W]\$ "

    
réponse donnée Medya 03.03.2014 - 09:13
la source
0

Ce petit ajout à l’excellent réponse de @ joão-pinto ajoute le nom de l’environnement virtuel lorsque vous exécutez workon commande.

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[%[email protected]%s:%s] ' % (venv, username, hostname, pwd)
    
réponse donnée katahdin 19.07.2018 - 14:38
la source

Lire d'autres questions sur les étiquettes