2012-04-05 6 views
5


Im Allgemeinen halte ich die Verzeichnis-spezifischen Einstellungen in .bashrc und wann immer ich Verzeichnis ändere, führe den Befehl source .bashrc aus, um diese Einstellungen wirksam zu machen.
Jetzt dachte ich daran, den cd-Befehl in ~/.bashrc zu manipulieren. Wenn ich also in ein neues Verzeichnis cd und dort irgendein .bashrc existiert, wird es automatisch geladen.cd-Befehl anpassen

Ähnlich wie cd $1; source .bashrc (Ich habe verifiziert, dass $ 1 gültiger Pfad ist), aber Problem ist CD ist Shell-Erstellung, also ist es eine rekursive Schleife (CD zeigt immer auf modifizierte CD). Wir haben keine Elf-Datei von CD (die wir im Allgemeinen von anderen Befehlen viz scp oder anderen haben). Wie kann ich das erreichen? Auch wenn shopt -s cdspell unterstützt wird, dann muss ich auch cd Schreibpfad im Argument von $ 1 haben.

+0

Warum schließen Leute es? Ist das Duplikat in einem anderen Thread, denke ich nicht. Oder wegen der Leute, die 100K oder 900K Ruf haben, konnte keine Chance bekommen, es zu beantworten? – peeyush

Antwort

6

Sie möchten den Befehl "builtin";

builtin muschel builtin [Argumente]

Ausführen des spezifizierten shell builtin, ihm Argumente zu übergeben, und das Ende-Status zurückzukehren. Dies ist nützlich, wenn eine Funktion definiert, deren Name dem einer eingebauten Shell entspricht, , wobei die Funktionalität des in der Funktion eingebauten Bausteins erhalten bleibt. Die eingebaute cd wird auf diese Weise neu definiert. Der Rückgabestatus ist falsch, wenn shell-builtin kein Shell-Befehl ist.

Von: http://linux.die.net/man/1/bash

So konnten Sie so etwas wie (ungetestet, haben keine bash praktisch entweder) haben;

function cd() { 
    builtin cd $1 \ 
     && test -e .bashrc \ 
     && source .bashrc 
} 
+0

kühl :-). (Warum gibt es 15 Zeichen Grenze?) – peeyush

+1

Sie brauchen 'test' vor' -e'. – l0b0

+0

Danke, repariere es. –

0

Sie konnten dieses versuchen:

function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; } 
alias cd = 'cdd' 
? 

Hat dieser sich nicht viel getestet, aber.

+0

Problem ist gleich, rekursiver Aufruf dieser neuen Definition von CD. – peeyush

+0

Ich habe das in der folgenden Variante getestet: Funktion cdd() { cd $ 1; if [-e ./.bashrc]; dann hallo "Hi, da!"; fi } alias cd = 'cdd' Dann prompt> cd Hallo, es – begemotv2718

1

RVM tut dies:

$ type cd 
cd is a function 
cd() 
{ 
    if builtin cd "[email protected]"; then 
     [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true; 
     __rvm_do_with_env_before; 
     __rvm_project_rvmrc; 
     __rvm_after_cd; 
     __rvm_do_with_env_after; 
     return 0; 
    else 
     return $?; 
    fi 
} 

Und ja, das funktioniert auf meinem Rechner. Im Wesentlichen, wie @RoryHunter sagte, verwenden Sie builtin und führen Sie Code aus, wenn es erfolgreich ist, oder geben Sie den Exitcode zurück, wenn es fehlschlägt.

2

Sie können direnv auschecken. https://github.com/zimbatm/direnv

+0

Eines der spezifischen Ziele bei der Entwicklung von direnv bestand darin, übergeordnete eingebaute Befehle zu vermeiden, wie dies bei RVM der Fall ist (did?). Stattdessen hängt direnv von Shell-Hooks wie PROMPT_COMMAND in bash ab, um Verzeichnisänderungen zu erkennen. – zimbatm