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

39

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 >
smauel
la source

Réponses:

30

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 vous êtes d'accord avec le résultat, ajoutez simplement la commande à votre ~/.bashrc.

João Pinto
la source
Ne pas demander l'évidence, mais comment pouvons-nous exactement ajouter la commande à ~/.bashrc? Ne ferait-il que coller la dernière ligne au bas du fichier?
FloatingRock
1
@ FloatingRock correct. Ajoutez-le simplement au fichier .bashrc.
Préfixe
C'est bien! Si vous éditez le programme python, il se met automatiquement à jour: sweet!
N3sh
cool! immédiatement volé cela.
Ferdy
Mettez à jour cette dernière impression ... pour imprimer (...) pour obtenir ce travail presque tel quel pour Python 3 aussi, excellent conseil, merci de partager !!
Sean
69

Si vous utilisez bash4 (Ubuntu 9.10 et versions ultérieures a bash4), l’option la plus simple est de 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 d'accès ne dépasse jamais 30 caractères), vous pouvez procéder comme suit:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '
geirha
la source
4
La documentation de PROMPT_DIRTRIM est disponible à l’ adresse suivante
Ben Amos le
11

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

PS1="\w\n>"
ak2
la source
Comme pour cela, il ne faut pas modifier votre invite PS1, mais simplement lancer votre commande avec un \ et appuyer sur Entrée . Cela oblige la commande à commencer à la ligne suivante avec l'invite PS2, qui est généralement > ... (je n'y avais pas pensé avant d'avoir vu votre suggestion :)
Peter.O
4

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
Chris Sullivan
la source
Beau! J'ai juste besoin d'ajouter quelques astuces sur la transformation de $ HOME en "~ /" et en ne comptant pas cela dans la "longueur" si $ PWD est sous le répertoire de base.
Michael Burr
1

Ce petit ajout à l'excellente réponse de @ joão-pinto ajoute le nom de l'environnement virtuel lorsque vous exécutez la workoncommande.

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
la source
C'est absolument essentiel! Si vous ne l'avez pas, vous supposerez que votre environnement virtuel Python ne fonctionne pas quand il le fait ... c'est pourquoi j'utilise sans vergogne cela pour l'intégrer à mon idée (avec les couleurs ...).
Mike Rongeur
1

Basé sur la réponse de Cris Sullivan , mais en gardant 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) > "
Manuel
la source
N'avez-vous toujours pas besoin d'exporter PS1 ici ?? C'est génial.
Chris Sullivan le
Oui, vous devez toujours exporter PS1, comme vous l'avez expliqué dans votre réponse. Je viens d'ajouter le répertoire de travail :-)
Manuel
0

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

Medya
la source
OP a mentionné qu'ils ne sont pas intéressés par cela.
Wjandrea
0

cette invite raccourcit tous les noms sauf la ligne en cours ceci:

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

PS1='\u:$$(eval "sps")/\W\$ '
Travis S
la source
0

Juste pour mettre à jour légèrement (pour Python3) et améliorer la réponse sélectionnée pour ajouter des couleurs à l'invite selon une invite BASH (dans Linux Mint 18.3):

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

Plus d'informations sur les codes de couleur dans un terminal BASH ici . Il y a probablement un moyen de savoir quelles couleurs votre terminal utilise automatiquement, mais je n'ai aucune idée de ce que cela pourrait être.

Avec la ligne shebang, la exportligne à inclure dans .bashrc devient alors:

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

NB1 ces codes d'échappement "\ e" doivent toujours être placés entre "\ [... \]", sinon les retours à la ligne sont complètement ratés.

NB2 pour obtenir votre chemin complet à tout moment

... $ pwd 

bien sûr...

Mike Rongeur
la source