宣言-Fが間違ったファイルを返すのはなぜですか

宣言-Fが間違ったファイルを返すのはなぜですか

set -x/を省略するための 2 つの小さな関数がありますset +x

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

そして

sz () {
    set +x
    export PS4=
}

これら2つの関数はfunctons.shソースから~/.bashrc、オンラインで閲覧可能ここ

新しい bash セッションにログインした直後に、次のように関数がどこにあるかを調べてみますsz()

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

これは、関数が で宣言されているとbash考えているが、その行には別の関数 がオンラインで存在することを示しています。sz()z.shzzz()ここ

sx()関数(および他の無数の関数)の結果は正しい

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

declare -Fコマンドが関数に対して間違った結果を取得するのはなぜですかsz?

答え1

functons.sh他のファイル内の関数と同じ名前のエイリアスもあります。

functons.sh

alias zzz=sz

z.sh

zzz () {
    df -h
}

これは混乱を招きますbash

例:

$ 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

エイリアスがないxfoo場合f1:

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

マニュアルbashにはテキストも含まれています

エイリアスは、用途によっては混乱を招きます。

「バグ」という見出しの下にあります。

関連情報