
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.sh
dieQuelled 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 bash
denkt, 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 -F
liefert der Befehl das falsche Ergebnis für die sz
Funktion?
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 xfoo
Alias in f1
:
$ source f1
$ source f2
$ shopt -s extdebug
$ declare -F foo
foo 1 f1
Das bash
Handbuch enthält auch den Text
Aliase können in manchen Fällen verwirrend sein.
unter der Überschrift „BUGS“.