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 >
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
.
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")]\$ '
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>"
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
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) > "
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)
J'aime celui-ci le plus, PS1="[\W]\\$ "