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

Почему команда -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функции?

решение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руководство также включен текст

В некоторых случаях использование псевдонимов может сбивать с толку.

в разделе «ОШИБКИ».

Связанный контент