為什麼聲明 -F 給出錯誤的文件

為什麼聲明 -F 給出錯誤的文件

我有兩個小函數要縮寫為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”標題下。

相關內容