我有两个小函数要缩写为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”标题下。