Fast jedes Mal, wenn ich auf meinem Computer (in diesem Fall unter Mac OS X 10.6.7) eine CD in ein anderes Verzeichnis starte (was bash ist), gebe ich sofort 'ls' ein, um das Inhaltsverzeichnis zu erhalten in diesem Verzeichnis. Ich versuche, eine Möglichkeit zu finden, 'cd' zu überschreiben, damit es in das angeforderte Verzeichnis wechselt und mir die Liste auf einen Schlag anzeigt.
Mit der folgenden Zeile in meinem ~ / .bash_profile konnte ich die Grundfunktionalität erreichen, nach der ich suche
function cl() { cd "$@"; ls -l; }
Das funktioniert wie erwartet. In das gewünschte Verzeichnis wechseln und mir dann den Inhalt anzeigen. Wenn ich auf ein Problem stoße, wird versucht, "cd" selbst zu überschreiben, anstatt einen neuen "cl" -Befehl zu erstellen.
Die folgenden Dinge tun nicht Arbeit
##### Attempt 1 #####
# Hangs the command line
function cd() { cd "$@"; ls -l; }
##### Attempt 2 #####
# Hangs the command line
function cd() { 'cd' "$@"; ls -l; }
##### Attempt 3 #####
# Does not change directory.
# Does list contents, but of the directory where you started.
function cd() { /usr/bin/cd "$@"; ls -l; }
#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;
Ich habe auch mehrere andere Iterationen ausprobiert, die nicht aufgelistet sind, und einen Alias erstellt, der auf die funktionierende Funktion 'cl' verweist. Nichts davon hat funktioniert.
Was ich in der Dokumentation gelesen habe, handelt von der Tatsache, dass 'cd' nicht als externer Befehl ausgeführt werden kann (was meiner Meinung nach die Art ist, wie die Funktion es verwenden müsste).
Also kann ich momentan meinen "cl" -Befehl verwenden und bekommen, was ich will, aber die Frage ist / bleibt:
Gibt es eine Möglichkeit, das Verhalten von 'cd' zu überschreiben, damit es in das angeforderte Verzeichnis wechselt und anschließend etwas anderes unternimmt?
quelle
cd ""
(zu dem, was diese Antwort auswerten sollte, ist anders alscd "$@"
mit leer$@
. Entschuldigung für die Verwirrung.Ich glaube, Sie stoßen auf eine Schleife. Ihre
cd
Funktion ruft aufcd
, das ist ... die Funktion.Sie müssen wissen, bei
builtin
welchem Schlüsselwort die Befehlssuche die in Bash enthaltenen Funktionen wie cd und nicht Ihre Funktion verwendetDer Aufruf
/usr/bin/cd
funktioniert auch dann nicht, wenn ein solcher Befehl vorhanden ist.Was würde passieren:
/bash/dir
./usr/bin/cd /dir/for/cd
./usr/bin/cd
geht zu dir/dir/for/cd
./usr/bin/cd
Ausgänge./bash/dir
, da der untergeordnete Prozess/usr/bin/cd
den übergeordneten nicht beeinflussen kann.Aliase sind auch einfache Textsubstitutionen. Sie können niemals Parameter haben.
quelle
builtin cd $@ && ls
; da sollte dercd
aufruf gelingen damit alles andere sinn macht. Denken Sie auch an Sonderfälle wiecd
(kein Argument).Ich empfehle, die CD nicht zu überschreiben, da einige andere Skripte die CD-Funktion hijacken, zum Beispiel rvm. Es wäre besser, stattdessen einen anderen Namen wie 'd' zu wählen und nicht den Typ 'builtin' in Ihrer Funktion anzugeben. Andernfalls würde der Hijacker nicht funktionieren. Ich benutze den folgenden Code:
quelle