
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.sh
que éfonted de ~/.bashrc
e 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 bash
pensa 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 -F
comando obtém o resultado errado para a sz
função?
Responder1
Você também tem um alias functons.sh
com 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 xfoo
alias em f1
:
$ source f1
$ source f2
$ shopt -s extdebug
$ declare -F foo
foo 1 f1
O bash
manual também inclui o texto
Os aliases são confusos em alguns usos.
sob o título "BUGS".