/usr/share/bash-completion/bash_completion
(すべてのディストリビューションのbashコンプリートパッケージ)にあるオートコンプリートスクリプトをデバッグしようとしています。
export PS4='+'$'\t''$LINENO'$'\t # \t for proper indentation
set -x
内部に現在のシェルを押してからコマンド(後にスペース)を入力し、Tabを押してオートコンプリートを呼び出します。
これは結果の一部です。
+ 2205 for dir in "${dirs[@]}"
+ 24 [[ -d /usr/share/bash-completion/completions ]]
+ 2207 for compfile in "$cmd" "$cmd.bash" "_$cmd"
+ 26 compfile=/usr/share/bash-completion/completions/bittch
+ 28 [[ -f /usr/share/bash-completion/completions/bittch ]]
+ 2207 for compfile in "$cmd" "$cmd.bash" "_$cmd"
ご覧のとおり、最初の行番号は2205
スクリプト内の絶対行番号です。驚くべきことに、次の行(ネストされたブロック)には番号が付けられています24
。つまり、関数自体の行番号に基づいています(下記参照)。
__load_completion()
{
local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions)
local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile
[[ -n $cmd ]] || return 1
for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}; do
dirs+=($dir/bash-completion/completions)
done
IFS=$ifs
if [[ $BASH_SOURCE == */* ]]; then
dirs+=("${BASH_SOURCE%/*}/completions")
else
dirs+=(./completions)
fi
local backslash=
if [[ $cmd == \\* ]]; then
cmd="${cmd:1}"
# If we already have a completion for the "real" command, use it
$(complete -p "$cmd" 2>/dev/null || echo false) "\\$cmd" && return 0
backslash=\\
fi
for dir in "${dirs[@]}"; do
[[ -d $dir ]] || continue
for compfile in "$cmd" "$cmd.bash" "_$cmd"; do
compfile="$dir/$compfile"
# Avoid trying to source dirs; https://bugzilla.redhat.com/903540
if [[ -f $compfile ]] && . "$compfile" &>/dev/null; then
[[ $backslash ]] && $(complete -p "$cmd") "\\$cmd"
return 0
fi
done
done
# Look up simple "xspec" completions
[[ -v _xspecs[$cmd] ]] &&
complete -F _filedir_xspec "$cmd" "$backslash$cmd" && return 0
return 1
}
私はこれがLINENO
意味することを知っています現在実行中のスクリプトまたはシェル関数の行番号。ただし、両方とも同じ機能を実行するため、両方とも相対(始めに基づいて__load_completion()
)または絶対的でなければなりません。
なぜこれですか?