Aus dem Bash-Handbuch
Die Regeln zur Definition und Verwendung von Aliasen sind etwas verwirrend. Bash liest immer mindestens eine vollständige Eingabezeile, bevor ein Befehl in dieser Zeile ausgeführt wird. Aliase werden beim Lesen eines Befehls erweitert, nicht beim Ausführen. Daher wird eine Aliasdefinition, die in derselben Zeile wie ein anderer Befehl angezeigt wird, erst wirksam, wenn die nächste Eingabezeile gelesen wird. Die Befehle, die der Aliasdefinition in dieser Zeile folgen, sind vom neuen Alias nicht betroffen. Dieses Verhalten ist auch ein Problem, wenn Funktionen ausgeführt werden. Aliase werden beim Lesen einer Funktionsdefinition erweitert, nicht beim Ausführen der Funktion , da eine Funktionsdefinition selbst ein zusammengesetzter Befehl ist. Als Konsequenz, In einer Funktion definierte Aliase sind erst verfügbar, nachdem diese Funktion ausgeführt wurde . Platzieren Sie Aliasdefinitionen aus Sicherheitsgründen immer in einer separaten Zeile, und verwenden Sie sie nicht in zusammengesetzten Befehlen.
Die beiden Sätze "Aliase werden erweitert, wenn eine Funktionsdefinition gelesen wird, nicht wenn die Funktion ausgeführt wird" und "Aliase, die in einer Funktion definiert sind, sind erst verfügbar, nachdem diese Funktion ausgeführt wurde" scheinen sich zu widersprechen.
Kannst du erklären, was sie bedeuten?
.bashrc
Dateien ganz oben angetroffen habe .Antworten:
Aliase werden beim Lesen einer Funktionsdefinition erweitert, nicht beim Ausführen der Funktion…
Obwohl
myfunc
definiert wurde, um aufzurufenmyalias
, und ich neu definiert habemyalias
,myfunc
führt immer noch die ursprüngliche Definition vonmyalias
. Da die Alias wurde erweitert , wenn die Funktion definiert wurde. Tatsächlich erinnert sich die Shell nicht mehr an diesemyfunc
Aufrufemyalias
. es kennt nur diemyfunc
anrufecat
:… In einer Funktion definierte Aliase sind erst verfügbar, nachdem diese Funktion ausgeführt wurde.
Der
myalias
Alias ist erst verfügbar, wenn diemyfunc
Funktion ausgeführt wurde. (Ich glaube, es wäre ziemlich seltsam, wenn die Definition der Funktion, die den Alias definiert, ausreichen würde, um den Alias zu definieren.)quelle
Ich brauche die Antwort, die im ersten Satz angegeben ist, wenn ich es in meinem Beispiel unten versuche
.bashrc
.danach
unalias -a; source ~/.bashrc
versuche ich auszuführenlf
undlsf
,Es scheint klar zu sein, dass Aliase bei der Funktionsdefinition und nicht bei der Funktionsausführung erweitert werden, da :
lf
, wird der Fehler-bash: ll: command not found
undlsf
,/usr/bin/ls
ist, nicht die Alias Form, keine Farbe markieren, und keine Steuer Zeichen nach ausführbarer Datei verwendet.quelle