2009-04-27 8 views
2

Dans ma situation actuelle, il n'est pas inhabituel pour moi d'avoir plusieurs ordinateurs UNIX auxquels je me connecte, comme plusieurs utilisateurs différents en fonction de la situation, et de parcourir différents répertoires sur les machines. J'utilise ksh à travers tout ça.Coloriage nom du répertoire dans ksh

Je jouais avec mon invite récemment, et j'ai été en mesure de l'obtenir pour changer certaines couleurs en fonction de mon nom d'utilisateur actuel et le serveur actuel. Cependant, ce que je voudrais aussi, c'est qu'il change de couleur en fonction de mon répertoire actuel. Par exemple, si j'étais dans le répertoire "foo", l'invite devrait être jaune, mais si j'étais dans le répertoire "bar", l'invite serait magenta. Dans les deux cas, les sous-répertoires devraient également compter, donc une simple vérification de sous-chaîne devrait suffire. Le problème que j'ai rencontré, cependant, est que lorsque je lance mon script .profile, il colore correctement le répertoire - mais il ne se met plus à jour de manière dynamique chaque fois que je passe à un autre répertoire - et je ne suis pas sûr de savoir comment Avant de faire tout le branchement, je pouvais l'obtenir pour imprimer correctement mon répertoire de travail actuel même après avoir changé de répertoire. J'ai fait du googling et trouvé des informations pour bash, mais ksh semble être largement ignoré. Comme je ne peux pas comprendre comment faire cela tout seul, je dois l'apporter à la communauté Stack Overflow, pour l'ajouter aux connaissances futures. Ainsi, avec ma longue explication, la "version rapide" de ma question est la suivante:

Dans ksh, comment puis-je configurer mon invite pour afficher le répertoire de travail actuel et colorier le texte en fonction de l'endroit où le courant le répertoire de travail est? Est-ce même possible?

Répondre

1

Pourquoi ne pas utiliser zsh? Il est basé sur ksh, et il est beaucoup plus puissant. Dans zsh, vous pouvez écrire la fonction chpwd qui est appelée implicitement chaque fois que vous changez de répertoire. Dans cette fonction, vous pouvez vérifier votre répertoire actuel et définir PS1 comme vous le souhaitez.

Sinon (même dans ksh), vous pouvez créer un alias pour la commande cd:

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

Quelque chose comme ça. Je ne suis pas sûr que ce soit correct, je ne me souviens pas de la syntaxe ksh.

-1

J'utilise ceci:

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

Ignore le temps et hname, mais le reste devrait travailler pour vous. Changer les couleurs va dépendre du terminal. Vous devez connaître les codes d'échappement pour chaque couleur du terminal que vous utiliserez. Si vous savez que vous n'utilisez qu'un xterm, ce sera plus facile.

1

Pour afficher le répertoire en cours dans ksh, mettez ceci dans votre fichier .profile: export PS1 = « \ $ PWD » qui mettra à jour dynamiquement lorsque vous changez de répertoire sans bidouiller avec des fonctions.

0

Puisque personne n'a vraiment répondu à la partie sur la couleur, voici comment je le ferais. Je ne peux pas colorier le texte, j'ai donc inclus une capture d'écran de mon terminal.

Voir Wikipedia's page on ANSI escape codes pour la liste complète des codes de couleur et print --man et printf --man pour les détails des séquences d'échappement d'impression en ksh. (Notez que ksh93v, actuellement en version bêta, contiendra un langage basé sur un prompt (je pense) sur bash, ce qui rendra ce genre de chose un peu plus facile, mais je pense que vous aurez probablement besoin d'utiliser quelque chose comme ça fonction pour faire des invites conditionnelles complexes comme celui-ci.)

> 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

Questions connexes