Почему объявляет -F дает неправильный файл

У меня есть 2 маленькие функции, чтобы сократить set -x / set +x , а именно:

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

а также

 sz () { set +x export PS4= } 

Эти 2 функции находятся в файле functons.sh который является источником d из ~/.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.sh , но в этой строке есть другая функция, zzz() , онлайн.

Результат для функции 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 ?

У вас также есть псевдоним в 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 также содержит текст

Псевдонимы в некоторых случаях сбивают с толку.

под заголовком «ЖУКИ».