
set -x
/を省略するための 2 つの小さな関数がありますset +x
。
sx () {
export PS4='+ [${BASH_SOURCE##*/}:${LINENO}]'
set -x
}
そして
sz () {
set +x
export PS4=
}
これら2つの関数はfunctons.sh
、ソースから~/.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
にはテキストも含まれています
エイリアスは、用途によっては混乱を招きます。
「バグ」という見出しの下にあります。