Por que declara -F informa o arquivo errado

6

Eu tenho duas 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 duas funções estão em um arquivo functons.sh , que é a origem d de ~/.bashrc e visíveis on-line < um href="https://github.com/jalanb/jab/blob/eec3fef3a8f9471f594b4c452cc80cd0a6676e55/src/bash/functons.sh#L428"> aqui .

Imediatamente após o login em uma nova sessão bash, eu tento descobrir onde a função sz() é 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 acha que a função sz() está declarada em z.sh , mas nessa linha existe uma função diferente, zzz() , online aqui .

O resultado para a função sx() (e 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 comando declare -F obtém o resultado errado para a função sz ?

    
por jalanb 30.05.2018 / 15:05

1 resposta

10

Você também tem um alias em 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 manual bash também inclui o texto

Aliases are confusing in some uses.

sob o título "BUGS".

    
por 30.05.2018 / 15:17