Trimmen Sie das Arbeitsverzeichnis der Terminal-Eingabeaufforderung

39

Bei Verwendung des Terminals in einer tiefen Ordnerstruktur kann die Eingabeaufforderung manchmal den größten Teil der Zeile belegen. Kann ich das Arbeitsverzeichnis in irgendeiner Weise zuschneiden? Ich weiß, dass ich das kann

PS1="\W >"

um nur das aktuelle Verzeichnis und nicht den vollständigen Pfad zu drucken, aber gibt es eine Möglichkeit, etwas zu haben wie:

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

Antworten:

30

Erstellen Sie ein kleines Python-Skript, das die gewünschte Trimmlogik implementiert.

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

Testen Sie es jetzt von einem Terminal aus:

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

Wenn Sie mit dem Ergebnis einverstanden sind, hängen Sie den Befehl einfach an Ihren an ~/.bashrc.

João Pinto
quelle
Nicht um das Offensichtliche zu fragen, aber wie genau hängen wir den Befehl an den an ~/.bashrc? Würde es nur die letzte Zeile am Ende der Datei einfügen?
FloatingRock
1
@FloatingRock richtig. Fügen Sie es einfach der .bashrc-Datei hinzu.
Präfix
Das ist toll! Wenn Sie das Python-Programm bearbeiten, wird es automatisch aktualisiert: süß!
N3sh
cool! sofort gestohlen.
Ferdy
Aktualisieren Sie diesen letzten Druck ..., um ihn zu drucken (...), um diese Arbeit so wie sie ist auch für Python 3 zu erhalten, toller Tipp, danke fürs Teilen !!
Sean
69

Wenn Sie bash4 verwenden (Ubuntu 9.10 und neuer hat bash4), ist es am einfachsten, nur die Variable PROMPT_DIRTRIM zu setzen. z.B:

PROMPT_DIRTRIM=2

Für ein Beispiel ähnlich dem von João Pinto (das in älteren Bash-Versionen funktioniert und sicherstellt, dass die Pfadkomponente nie länger als 30 Zeichen ist), könnten Sie Folgendes tun:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '
geirha
quelle
4
Die Dokumentation für PROMPT_DIRTRIM finden Sie hier: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos
11

Eine andere Möglichkeit, dieses Problem zu umgehen, besteht darin, einen Zeilenumbruch in PS1 einzufügen, sodass das Arbeitsverzeichnis und die eigentliche Eingabeaufforderung in separaten Zeilen angezeigt werden. Beispiel:

PS1="\w\n>"
ak2
quelle
Ähnlich wie bei diesem Befehl wird die PS1-Eingabeaufforderung nicht geändert, sondern der Befehl wird einfach mit einem \ gestartet und die Eingabetaste gedrückt . Dies zwingt den Befehl, in der nächsten Zeile mit der PS2-Eingabeaufforderung zu beginnen, was normalerweise > ... ist (daran hatte ich erst gedacht, als ich Ihren Vorschlag sah :)
Peter.O
4

Fügen Sie dieses dem Boden von Ihrem hinzu ~/.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) > "

Zugegeben, das könnte wahrscheinlich sauberer sein, aber ich wollte einen Riss drauf haben.

Erwartete Ausgabe für Verzeichnisse mit mehr als drei Ebenen.

/home/chris/../Node Projects >

Erwartete Ausgabe für Verzeichnisse von Desktop und zurück.

/home/chris/Desktop > 
/home/chris >  
/home
Chris Sullivan
quelle
Schön! Ich muss nur ein paar Details hinzufügen, wie man $ HOME in "~ /" umwandelt und dies nicht als Teil der 'Länge' zählt, wenn sich $ PWD im Home-Verzeichnis befindet.
Michael Burr
1

Diese kleine Ergänzung zu @ joão-pintos hervorragender Antwort fügt den Namen der virtuellen Umgebung hinzu, wenn Sie den workonBefehl ausführen .

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
quelle
Ah, nette Idee ... vielleicht mit meinen Farbcodes kombinieren?
Mike Nagetier
1

Basierend auf der Antwort von Cris Sullivan , aber unter Beibehaltung des ~Ordners für den privaten Bereich

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
quelle
Müssen Sie hier nicht noch PS1 exportieren? Sieht großartig aus.
Chris Sullivan
Ja, Sie müssen PS1 noch exportieren, wie in Ihrer Antwort beschrieben. Ich füge nur das Arbeitsverzeichnis hinzu :-)
Manuel
0

Ich mag dieses am meisten, PS1="[\W]\\$ "

Medya
quelle
OP erwähnte, dass sie daran nicht interessiert sind.
wjandrea
0

Diese Eingabeaufforderung verkürzt alle Namen mit Ausnahme der aktuellen Zeile wie folgt:

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

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

Nur um ein kleines Update (für Python3) durchzuführen und die ausgewählte Antwort zu verbessern , um der Eingabeaufforderung Farben hinzuzufügen, wie bei einer BASH-Eingabeaufforderung (in Linux Mint 18.3 jedenfalls):

#! /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:] 

# colours as per my current BASH Terminal: 
# username + hostname: bold green
# path and $: bold blue
print( '\[\e[;1;32m\]%s@%s \[\e[;1;34m\]%s $\[\e[0m\]  ' % (username, hostname, pwd) )

Mehr zu Farbcodes in einem BASH-Terminal hier . Es gibt wahrscheinlich eine Möglichkeit herauszufinden, welche Farben Ihr Terminal automatisch verwendet, aber ich habe keine Ahnung, was das sein könnte.

Mit der shebang-Zeile wird die exportZeile für die Aufnahme in .bashrc dann zu:

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

NB1 diese "\ e" Escape-Codes müssen immer in "\ [... \]" eingeschlossen sein, sonst werden Zeilenumbrüche völlig durcheinander gebracht.

NB2, um jederzeit den vollen Weg zu finden, gehen Sie einfach

... $ pwd 

Na sicher...

Mike Nagetier
quelle