2016-05-28 12 views
2

Ich benutze zsh und möchte die eingebaute cd Funktion etwas erweitern. Ich möchte, dass, wenn ich cd aufrufen, es direkt ändert und dann den Inhalt des Verzeichnisses auflistet.ZSH: Call eingebaute Funktion von Zsh-Funktion, die den gleichen Namen verwendet

function cd() { 
    cd $1 
    ls . 
} 

Ich hätte diesen Code erwartet zu arbeiten, aber es stellt sich heraus, der Aufruf an cd bezieht sich auf die Funktionsdefinition in einer Endlosschleife hängen bleibt.

Gibt es eine Lösung, um dieses Problem zu lösen, abgesehen von der Wahl eines anderen Namens für meine Funktion?

UPDATE

Merkwürdigerweise war diese

function cd() { 
    `echo $1` 
    ls . 
} 

Keine Ahnung, warum.

Antwort

3

Um builtin Befehle zu verwenden, aus Funktionen mit dem gleichen Namen, oder anderswo für diese Angelegenheit, können Sie das builtin precommand Modifikator:

function cd() { 
    builtin cd $1 
    ls . 
} 

builtin COMMANDzsh sagt die builtin zu verwenden, um mit der Name COMMAND anstelle eines Alias, einer Funktion oder eines externen Befehls desselben Namens. Wenn ein solches Built-in nicht existiert, wird eine Fehlermeldung ausgegeben. , Builtin oder Funktion mit dem gleichen Namen


Für Fälle, in denen Sie einen externen Befehl statt eines Alias ​​verwenden möchten, können Sie den command precommand Modifikator. Zum Beispiel:

command echo foobar 

Dies wird die binären echo (höchstwahrscheinlich /bin/echo) anstelle von zsh der builtin echo.


Im Gegensatz zu Funktionen builtin und command sind in der Regel nicht notwendig, mit Aliase Rekursion zu verhindern. Während es möglich ist, einen Alias ​​in einer Alias-Definition zu verwenden, wird jeder Alias-Name nur einmal expandiert. Beim zweiten Vorkommen wird der Alias ​​nicht erweitert und eine Funktion, ein eingebauter oder externer Befehl wird verwendet.

% alias echo="echo echo:" 
% echo foobar 
echo: foobar 
% alias xx="yy x:" 
% alias yy="xx y:" 
% xx foobar 
zsh: command not found: xx 

Natürlich können Sie immer noch builtin oder command in Aliasnamen verwenden, wenn Sie die Verwendung eines anderen Alias ​​verhindern wollen, oder wenn Sie speziell einen eingebauten oder externen Befehl verwenden möchten. Zum Beispiel:

alias echo="command echo" 

Mit diesen binären echo wird anstelle der builtin verwendet werden.

2

Warum der Befehl echo funktioniert, liegt daran, dass Sie wahrscheinlich die Option autocd aktiviert haben. Sie können dies überprüfen, indem Sie setopt eingeben, um Ihre Optionsliste zu erhalten.

Dann das Echo des Verzeichnisnamens und das Abfangen der Ausgabe löste die autocd aus und Sie gingen in dieses Verzeichnis.