Por que declara -F fornece o arquivo errado

Por que declara -F fornece o arquivo errado

Tenho 2 pequenas funções para abreviar set -x/ set +x, a saber:

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

e

sz () {
    set +x
    export PS4=
}

Essas 2 funções estão em um arquivo functons.shque éfonted de ~/.bashrce visível on-lineaqui.

Imediatamente após fazer login em uma nova sessão do bash, tento descobrir onde a sz()função está assim:

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

Isso mostra que bashpensa que a sz()função está declarada em z.sh, mas nessa linha há uma função diferente, zzz()onlineaqui.

O resultado da sx()função (e de todas as minhas inúmeras outras funções) está correto

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

Por que o declare -Fcomando obtém o resultado errado para a szfunção?

Responder1

Você também tem um alias functons.shcom o mesmo nome de uma função em seu outro arquivo.

Em functons.sh:

alias zzz=sz

Em z.sh:

zzz () {
    df -h
}

Isso confunde bash.

Exemplo:

$ 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

Sem o xfooalias em f1:

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

O bashmanual também inclui o texto

Os aliases são confusos em alguns usos.

sob o título "BUGS".

informação relacionada