Ich möchte die Funktionalität des cd
Befehls gemäß meinen Anforderungen anpassen .
Ich habe die folgende Funktion definiert -
function cd () { cd "$@" && pushd "$@"; }
Mit dieser Funktion soll das Verzeichnis automatisch auf den Stapel verschoben werden, damit ich nicht pushd .
jedes Mal manuell tippen muss.
Die obige Funktion ist jedoch eine unendlich rekursive Funktion, da der Aufruf cd
von als die Funktion selbst und nicht als die cd
eingebaute interpretiert wird .
Wie beziehe ich mich auf die cd
in dieser Funktion eingebaute?
Ich weiß, dass Aliase mit entkommen werden können \
. Wie können Funktionen oder Referenz-Built-Ins expliziter umgangen werden?
Hinweis: Ich möchte meine Funktion nicht in eine andere Funktion umbenennen.
bash
shell-script
shell-builtin
Kshitiz Sharma
quelle
quelle
alias cd=pushd
? Was erwarten Sie, wenn Sie zu etwas wechseln, das kein absoluter Pfad ist (z. B.cd ../
)?pushd
unterstützt nicht-P
. Aber du hast recht, wie in der Frage gezeigtfunction cd
sieht das ein bisschen falsch aus, da es das Verzeichnis zweimal gewechselt hat.Antworten:
Das
command
Builtin erzwingt, dass ein Befehlsname als integrierter oder externer Befehl interpretiert wird (Alias und Funktionssuche überspringen). Es ist in allen POSIX-Shells einschließlich Bash verfügbar.(Beachten Sie, dass dieses Beispiel schlecht ist: Es funktioniert nicht mit relativen Pfaden, und Sie können es auch einfach
pushd
als erstes eingeben.)In bash und zsh (aber nicht in ksh) können Sie
builtin
erzwingen, dass ein Befehlsname als eingebauter Name interpretiert wird, ausgenommen Aliase, Funktionen und externe Befehle.quelle
Bash hat einen (eingebauten) Befehl
builtin
, der genau das tut, was Sie brauchen. Durch Ersetzencd
durchbuiltin cd
in Ihrer Funktion wird die Rekursion behoben.quelle
Ich vermute, wenn Sie sagen, Sie möchten Ihre Funktion nicht in etwas anderes umbenennen, meinen Sie, Sie möchten Ihre Funktion mit dem gleichen Namen wie der ursprüngliche Befehl aufrufen können.
Eine andere Möglichkeit, dies auch für Dinge zu tun, die nicht integriert sind, besteht darin, Ihrer Funktion einen anderen Namen zu geben und dann einen Alias für den umschlossenen Befehl zu definieren. Dies funktioniert, weil der Alias im Ausführungskontext Ihrer Funktion nicht vorhanden ist.
Beispiel wrapper.sh:
Und in zB .bash_aliases:
Aber das ist ziemlich abgedreht.
command
Wenn möglich, ist die Verwendung vorzuziehen.quelle
Damit dies mit relativen Pfaden funktioniert, ist Folgendes erforderlich:
Dies setzt voraus, dass Sie auf einer modernen Linux-Distribution sind, die das Dienstprogramm 'realpath' enthält. (RHEL 6 zum Beispiel nicht). Wenn Perl verfügbar ist, kann 'realpath' simuliert werden mit:
quelle