Warum gibt „declare -F“ die falsche Datei aus?

Warum gibt „declare -F“ die falsche Datei aus?

Ich habe 2 kleine Funktionen zum Abkürzen von set -x/ set +x, und zwar:

sx () {
    export PS4='+ [${BASH_SOURCE##*/}:${LINENO}]'
    set -x
}

Und

sz () {
    set +x
    export PS4=
}

Diese beiden Funktionen befinden sich in einer Datei, functons.shdieQuelled von ~/.bashrc, und online sichtbarHier.

Direkt nach dem Einloggen in eine neue Bash-Sitzung versuche ich herauszufinden, wo sich die sz()Funktion befindet, und zwar folgendermaßen:

$ shopt -s extdebug; declare -F sz; shopt -u extdebug
sz 25 /Users/jab/src/git/hub/jab/src/bash/keyboard/z.sh

Dies zeigt, dass bashdenkt, die sz()Funktion sei in deklariert z.sh, aber in dieser Zeile steht eine andere Funktion, zzz(), onlineHier.

Das Ergebnis für die sx()Funktion (und alle meine unzähligen anderen Funktionen) ist korrekt

$ shopt -s extdebug; declare -F sx; shopt -u extdebug
sx 428 /Users/jab/src/git/hub/jab3/src/bash/functons.sh

Warum declare -Fliefert der Befehl das falsche Ergebnis für die szFunktion?

Antwort1

Sie haben auch einen Alias functons.sh​​mit demselben Namen wie eine Funktion in Ihrer anderen Datei.

In functons.sh:

alias zzz=sz

In z.sh:

zzz () {
    df -h
}

Das verwirrt bash.

Beispiel:

$ cat f1
foo () { echo hello; }
alias xfoo=foo

$ cat f2
xfoo () { echo beep; }

$ source f1
$ source f2
$ shopt -s extdebug
$ declare -F foo
foo 1 f2

Ohne den xfooAlias ​​in f1:

$ source f1
$ source f2
$ shopt -s extdebug
$ declare -F foo
foo 1 f1

Das bashHandbuch enthält auch den Text

Aliase können in manchen Fällen verwirrend sein.

unter der Überschrift „BUGS“.

verwandte Informationen