Alias ​​und Funktionen

17

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?

Tim
quelle
Gute Frage! Ich habe heute etwas Neues gelernt. Ich habe eigentlich 2 Dinge gelernt: 1) diese Information über die Alias-Erweiterung zum Zeitpunkt des Lesens der Funktion def und 2) dass ich das Bash-Handbuch wirklich sorgfältig lesen sollte (was ich dachte, ich habe es bereits getan, aber anscheinend nicht getan ^^ )
Olivier Dulac
4
Die Hauptfrage ist, sollte jemand Aliase im nicht interaktiven Modus verwenden? Dafür gibt es Funktionen, und Aliase machen das Scripting fehleranfälliger. Ich habe die obigen Informationen eigentlich nie benötigt, da ich nur Aliase in .bashrcDateien ganz oben angetroffen habe .
Orion

Antworten:

29
  1. Aliase werden beim Lesen einer Funktionsdefinition erweitert, nicht beim Ausführen der Funktion…

    $ echo "Der schnelle braune Fuchs springt über den faulen Hund." > myfile
     
    $ alias myalias = cat
     
    $ myfunc () {
    > myalias myfile
    >}
     
    $ myfunc
    Der schnelle braune Fuchs springt über den faulen Hund.
     
    $ alias myalias = "ls -l"
     
    $ myalias myfile
    -rw-r - r-- 1 meinbenutzername meinegruppe 45 Dez 13 07:07 meine datei
     
    $ myfunc
    Der schnelle braune Fuchs springt über den faulen Hund.

    Obwohl myfuncdefiniert wurde, um aufzurufen myalias, und ich neu definiert habe myalias, myfuncführt immer noch die ursprüngliche Definition von myalias. Da die Alias wurde erweitert , wenn die Funktion definiert wurde. Tatsächlich erinnert sich die Shell nicht mehr an diese myfuncAufrufe myalias. es kennt nur die myfuncanrufe cat:

    $ Geben Sie myfunc ein
    myfunc ist eine Funktion
    myfunc ()
    {
    Katze myfile
    }
  2. … In einer Funktion definierte Aliase sind erst verfügbar, nachdem diese Funktion ausgeführt wurde.

    $ echo "Der schnelle braune Fuchs springt über den faulen Hund." > myfile
     
    $ myfunc () {
    > alias myalias = cat
    >}
     
    $ myalias myfile
    -bash: myalias: Befehl nicht gefunden
     
    $ myfunc
     
    $ myalias myfile
    Der schnelle braune Fuchs springt über den faulen Hund.

    Der myaliasAlias ​​ist erst verfügbar, wenn die myfuncFunktion 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.)

G-Man sagt, "Monica wiedereinsetzen"
quelle
4
+1, gute Antwort. Eine wichtige "Konsequenz" ist, dass, wenn man Funktionen und Aliase in einem Skript definieren möchte, die Aliase-Definition besser vor die Funktionsdefinitionen gestellt werden sollten! (Offensichtlich jetzt angesichts der Antwort, aber ich wusste das nicht).
Olivier Dulac
Vielen Dank. Ich denke, ein zugrunde liegendes Problem ist der Unterschied zwischen dem Ausführen der Definition einer Funktion und dem Aufrufen einer Funktion. Welche Shell-Operationen werden speziell ausgeführt, während die Definition einer Funktion ausgeführt wird bzw. während die Funktion aufgerufen wird? Gibt es Shell-Operationen, die sowohl beim Ausführen der Definition einer Funktion als auch beim Aufrufen der Funktion ausgeführt werden, oder wird beim Ausführen der Definition einer Funktion und beim Aufrufen der Funktion ein nicht überlappender Satz von Shell-Operationen ausgeführt?
Tim
Nun, es ist ein bisschen wie der Unterschied zwischen dem Bau eines Autos und dem Autofahren. Oder ein Sandwich kaufen und ein Sandwich essen. Ich habe eine detailliertere Antwort auf Ihre andere Frage gegeben .
G-Man sagt, dass Monica
Vielen Dank. Nachdem ich das Zitat aus dem Bash-Handbuch und Ihre Antwort noch einmal gelesen habe, bin ich verwirrt über die Bedeutung der Ausführung einer Funktion. Bedeutet das, die Definition einer Funktion auszuführen oder eine Funktion aufzurufen? Siehe unix.stackexchange.com/q/384209/674
Tim
1

Ich brauche die Antwort, die im ersten Satz angegeben ist, wenn ich es in meinem Beispiel unten versuche.bashrc .

alias ls='\ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
    local CMD=${1:-ls} DIR=${2:-.};
    $CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; }     # list all file, no directories

danach unalias -a; source ~/.bashrcversuche ich auszuführen lfund lsf,

$ lf
-bash: ll: command not found

$ lsf
./file1 ./file2 ./script.sh ...     # no color, no control-chars

$ ls $(find -maxdepth 1 -type f)
./file1 ./file2 ./script.sh* ...

Es scheint klar zu sein, dass Aliase bei der Funktionsdefinition und nicht bei der Funktionsausführung erweitert werden, da :

  • Wenn ich ausführe lf, wird der Fehler -bash: ll: command not foundund
  • wenn ich ausführen lsf, /usr/bin/lsist, nicht die Alias Form, keine Farbe markieren, und keine Steuer Zeichen nach ausführbarer Datei verwendet.
qeatzy
quelle