bash $LINENO가 함수의 내부 블록 내에서 변경되는 이유는 무엇입니까?

bash $LINENO가 함수의 내부 블록 내에서 변경되는 이유는 무엇입니까?

/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()) 또는 절대적이어야 합니다.
왜 이런거야?

관련 정보