
我有兩個小函數要縮寫為set -x
/ set +x
,即:
sx () {
export PS4='+ [${BASH_SOURCE##*/}:${LINENO}]'
set -x
}
和
sz () {
set +x
export PS4=
}
這兩個函數位於一個文件中,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”標題下。