¿Por qué declarar -F da el archivo incorrecto?

¿Por qué declarar -F da el archivo incorrecto?

Tengo 2 pequeñas funciones para abreviar set -x/ set +x, a saber:

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

y

sz () {
    set +x
    export PS4=
}

Estas 2 funciones están en un archivo functons.shque esfuented desde ~/.bashrcy visible en líneaaquí.

Inmediatamente después de iniciar sesión en una nueva sesión de bash, trato de averiguar dónde sz()está la función de esta manera:

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

Esto muestra que bashpiensa que la sz()función está declarada en z.sh, pero en esa línea hay una función diferente, zzz()en líneaaquí.

El resultado de la sx()función (y de todas mis otras funciones) es correcto

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

¿Por qué el declare -Fcomando obtiene un resultado incorrecto para la szfunción?

Respuesta1

También tiene un alias functons.shcon el mismo nombre que una función en su otro archivo.

En functons.sh:

alias zzz=sz

En z.sh:

zzz () {
    df -h
}

Esto confunde bash.

Ejemplo:

$ 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

Sin el xfooalias en f1:

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

El bashmanual también incluye el texto.

Los alias son confusos en algunos usos.

bajo el título "ERRORES".

información relacionada