web-dev-qa-db-fra.com

couper la commande de terminal Répertoire de travail d'invite

Lors de l'utilisation du terminal dans une structure de dossiers profonds, l'invite peut parfois occuper la majeure partie de la ligne. Y at-il un moyen par lequel je peux couper le répertoire de travail? Je sais que je peux faire

PS1="\W >"

d’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 >
39
smauel

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 '[%s@%s:%s] ' % (username, hostname, pwd)

Maintenant testez-le depuis un terminal:

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

Si le résultat vous convient, ajoutez simplement la commande à votre ~/.bashrc.

29
João Pinto

Si vous utilisez bash4 (Ubuntu 9.10 et versions ultérieures 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 de chemin ne dépasse jamais 30 caractères), vous pouvez faire quelque chose comme ceci:

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

Un autre moyen de contourner ce problème consiste à inclure un saut de ligne dans PS1, de sorte que le répertoire de travail et l'invite réelle apparaissent sur des lignes distinctes, par exemple:

PS1="\w\n>"
11
ak2

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) > "

Certes, cela pourrait probablement être plus propre, mais je voulais me faire une idée.

Sortie attendue pour les répertoires de plus de trois couches.

/home/chris/../Node Projects >

Sortie attendue pour les répertoires à partir du bureau et inversement.

/home/chris/Desktop > 
/home/chris >  
/home
3
Chris Sullivan

Basé sur la réponse de Cris Sullivan , mais en conservant le ~ pour le dossier de départ

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) > "
1
Manuel

Ce petit ajout à l'excellent answer de @ joão-pinto est ajouté au nom de l'environnement virtuel lorsque vous exécutez la commande 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)
0
katahdin

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

0
Medya