2009-04-27 6 views
2

In meiner derzeitigen Situation ist es nicht ungewöhnlich, dass ich mehrere UNIX-Computer habe, mit denen ich mich verbinde, je nach Situation mehrere verschiedene Benutzer und verschiedene Verzeichnisse auf den Maschinen durchsuche. Ich benutze ksh durch die ganze Sache.Einfärben von Verzeichnisnamen in ksh

Ich habe vor kurzem mit meiner Eingabe gegriffen, und ich konnte es bekommen, um einige Farben abhängig von meinem aktuellen Benutzernamen und aktuellen Server zu ändern. Was ich aber auch möchte, ist, dass es die Farben basierend auf meinem aktuellen Verzeichnis ändert. Zum Beispiel, wenn ich im Verzeichnis "foo" wäre, sollte die Eingabeaufforderung gelb sein, aber wenn ich im Verzeichnis "bar" wäre, wäre die Eingabeaufforderung Magenta. In beiden Fällen sollten Unterverzeichnisse ebenfalls zählen, sodass eine einfache Unterzeichenfolgenprüfung ausreichen sollte.

Das Problem, das ich jedoch bekam, ist, dass wenn ich mein .Profile-Skript ausführe, es das Verzeichnis richtig färbt - aber es nicht mehr dynamisch aktualisiert, wenn ich in ein anderes Verzeichnis wechseln - und ich bin nicht sicher, wie Bevor ich alle Verzweigungen machte, konnte ich mein aktuelles Arbeitsverzeichnis korrekt drucken, nachdem ich die Verzeichnisse gewechselt hatte.

Ich habe etwas googeln und Informationen für bash finden, aber ksh scheint weitgehend ignoriert zu werden. Da ich nicht herausfinden kann, wie ich das alleine machen kann, muss ich es in die Stack Overflow Community bringen, um es dem zukünftigen Wissen hinzuzufügen. Also, mit meiner langatmigen Erklärung ist die "schnelle Version" meiner Frage wie folgt:

In ksh, wie kann ich meine Eingabeaufforderung einrichten, um das aktuelle Arbeitsverzeichnis anzuzeigen und den Text basierend auf der aktuellen Farbe Arbeitsverzeichnis ist? Ist es überhaupt möglich?

Antwort

1

Warum nicht zsh verwenden? Es basiert auf ksh, und es ist viel mächtiger. In zsh können Sie die Funktion chpwd schreiben, die bei jedem Verzeichniswechsel implizit aufgerufen wird. In dieser Funktion können Sie Ihr aktuelles Verzeichnis überprüfen und PS1 auf das einstellen, was Sie wollen.

Alternativ (auch in KSH) Sie einen Alias ​​für cd Befehl erstellen:

change_my_ps() { 
    PS1=... 
} 
better_cd() { 
    builtin cd "[email protected]" 
    change_my_ps 
} 
alias cd=better_cd 

Etwas Ähnliches. Ich bin mir nicht sicher, ob es richtig ist, ich erinnere mich nicht an die ksh-Syntax.

-1

Ich benutze diese:

function chdir 
{ 
    cd "[email protected]" 
    CWDH=${PWD%/*} 
    PS1="($_time)$hname:${CWDH##*/}/${PWD##*/} ->" 
    export PS1 
} 
alias cd=chdir 
chdir . 

die Zeit und hname ignorieren, aber der Rest sollte für Sie arbeiten. Das Ändern der Farben wird terminalabhängig sein. Sie müssen die Escape-Codes für jede Farbe für das Terminal kennen, das Sie verwenden werden. Wenn Sie wissen, dass Sie nur ein xterm verwenden, wird es einfacher.

1

Um das aktuelle Verzeichnis in ksh anzuzeigen, legen Sie dies in Ihrer .Profile-Datei: Export PS1 = "\ $ PWD" Das wird dynamisch aktualisiert, wenn Sie Verzeichnis wechseln, ohne mit Funktionen herumzuärgern.

0

Da niemand wirklich den Teil über die Farbe beantwortet hat, hier ist, wie ich es tun würde. Ich kann den Text nicht färben, daher habe ich auch einen Screenshot von meinem Terminal beigefügt.

Eine vollständige Liste der Farbcodes und print --man und printf --man finden Sie unter Wikipedia's page on ANSI escape codes für Details zum Drucken von Escape-Sequenzen in ksh.

(Beachten Sie, dass ksh93v, derzeit in der Beta-Version, eine prompte Sprache basierend auf Bashs enthält, was diese Art von Dingen etwas einfacher macht, obwohl ich denke, dass Sie wahrscheinlich immer noch so etwas verwenden müssen Funktion komplexe bedingte Anweisungen, wie diese zu tun.)

> cat ~/scripts/prompt  
function prompt 
{ 
    set -eu 
    typeset c= 
    case $PWD in 
     */foo) c=3;; # yellow 
     */bar) c=5;; # magenta 
    esac 
    print "\E[3${c}m$PWD\E[m > " 
} 
PS1='`prompt`' 
> . ~/scripts/prompt 
/Users/adavies > cd foo 
/Users/adavies/foo > cd ../bar 
/Users/adavies/bar > 

enter image description here