为什么声明 -F 给出错误的文件

为什么声明 -F 给出错误的文件

我有两个小函数要缩写为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手册还包括文本

别名在某些用途中会造成混淆。

在“BUGS”标题下。

相关内容