2010-07-29 9 views
16

Ich möchte eine bestimmte Bash-Funktion ausführen, wenn ich ein neues Verzeichnis eingeben. Some mag:Führen Sie eine Bash-Funktion beim Eingeben eines Verzeichnisses

alias cd="cd [email protected] && myfunction" 

[email protected] nicht dort arbeiten, und einen umgekehrten Schrägstrich Hinzufügen hilft nicht. Ich bin auch ein wenig besorgt über das Mischen mit CD, und es wäre schön, wenn dies für andere Befehle, die Verzeichnis geändert, wie pushd und popd funktioniert.

Gibt es bessere Aliase/Befehle?

Antwort

17

Die einfachste Lösung, die ich mit oben kommen kann ist diese

myfunction() { 
    if [ "$PWD" != "$MYOLDPWD" ]; then 
    MYOLDPWD="$PWD"; 
    # strut yer stuff here.. 
    fi 
} 

export PROMPT_COMMAND=myfunction 

Das sollte es tun. Es funktioniert mit allen Befehlen und wird ausgelöst, bevor die Eingabeaufforderung angezeigt wird.

+1

Fügen Sie einfach "printf" \ e] 1; $ PWD \ a "' und bam (!) Hinzu, der Tabname wird in pwd geändert. – Fadi

+0

@Fadi die Wahrheit ist, fügen die meisten Leute einfach eine Escape-Sequenz zu der Eingabeaufforderung selbst hinzu, es ist nicht wirklich wichtig, dass sie mit jeder Eingabeaufforderung aktualisiert wird (statt nur beim Wechseln von Verzeichnissen), da dies nicht bemerkbar ist. – falstro

2

Ich habe ein ZSH-Skript geschrieben verwendet die Callback-Funktion chpwd, um projektspezifische ZSH-Konfigurationen zu beziehen. Ich bin mir nicht sicher, ob es mit Bash funktioniert, aber ich denke, es wird einen Versuch wert sein. Wenn es keine Skriptdatei in dem Verzeichnis findet, in das Sie cd'ing, wird es die übergeordneten Verzeichnisse überprüfen, bis es ein Skript findet, um zu finden (oder bis es / erreicht). Es ruft auch eine Funktion unmagic auf, wenn Sie sich aus dem Verzeichnis entfernen, wodurch Sie Ihre Umgebung bereinigen können, wenn Sie ein Projekt verlassen.

http://github.com/jkramer/home/blob/master/.zsh/func/magic

Beispiel für eine "magische" Skript:

export BASE=$PWD # needed for another script of mine that allows you to cd into the projects base directory by pressing ^b 

ctags -R --languages=Perl $PWD # update ctags file when entering the project directory 

export PERL5LIB="$BASE/lib" 

# function that starts the catalyst server 
function srv { 
    perl $BASE/script/${PROJECT_NAME}_server.pl 
} 

# clean up 
function unmagic { 
    unfunction src 
    unset PERL5LIB 
} 
+0

Es scheint keinen zu geben. –

16

Aliases akzeptieren keine Parameter. Sie sollten eine Funktion verwenden. Es muss nicht jedes Mal automatisch ausgeführt werden, wenn eine Eingabeaufforderung ausgegeben wird.

function cd() { builtin cd "[email protected]" && myfunction; } 

Das builtin Schlüsselwort ermöglicht es Ihnen, ohne eine Rekursion ein Bash gebautet neu zu definieren. Das Angeben des Parameters bewirkt, dass Leerzeichen in Verzeichnisnamen vorhanden sind.

Die Bash docs sagen:

Für fast jeden Zweck, Shell-Funktionen werden über Aliase bevorzugt.

+0

es deckt nicht seine Besorgnis über Pushd, Popd etc; und eine Funktion für jeden Fall zu machen, macht es vielleicht komplexer als ein Befehlsaufruf. – falstro

6

Es gibt ein paar andere Versionen von diesem gibt, einschließlich

  • smartcd, die ich geschrieben habe, und hat eine Tonne von Features, einschließlich Templating und temporäre Variable Speichern
  • ondir, der kleiner ist und viel einfacher

Beide unterstützen sowohl bash und zsh

+0

Oh Mann, das Smartcd sieht lecker aus! – mihai

Verwandte Themen