Puncte:0

Rularea aceluiași cod cu -u și +u dă rezultate diferite

drapel cn

Am un set destul de mare de scripturi, care este partea inițială a creării unei logici de depanare/logging pentru scripturile bash. Există o cantitate considerabilă de cod în sistem. Din fericire, pot demonstra diferitele rezultate pe care nu le pot explica atunci când scriptul este rulat +u și -u. Setarea variabilelor așa cum a fost testată folosind +u devin variabile nesetate atunci când sunt executate cu -u. Numele variabilei în acest caz este $FUNCNAME

Scriptul de testare scurt este după cum urmează:

#!/bin/bash


### set -e
### set -f
### set -u
### set -C
### set -P
### set -o pipefail


export PS4='+:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: '


set -o verbose

    # vXtrap Field Separator u0081 (plus/minus)
### export vXtrapLFS='\v'

    # înlocuitor BASH_SUBSHELL
exportați vXtrapSub=()

    # înlocuitor BASH_SOURCE
export vXtrapSrc=()

    # Script de înlocuire
    # nume de bază „${vXtrapSub[$lIdx]}}” „.sh”
export vXtrapScr=()

    # înlocuitor FUNCNAME
export vXtrapFNm=()

    # LINENO de înlocuire 
    # unde BASH_LINENO[lIdx] ar trebui să fie egal cu vXtrapLNo[lIdx+1]
export vXtrapLNo=()

    # LINENO inițiere
    # de linie raportul inițial al funcției în Debug Trap
export vXtrapLNI=()

    # înlocuitor BASH_COMMAND
    # aceasta este comanda sursă originală nesubstituită
    # următoarea este o versiune substituită comprimată a comenzii sursă
    # „${vXtrcTrapArg0[$lIdx]} ${vXtrcTrapArgV[$lIdx]}”
exportați vXtrapCmd=()

    # înlocuitor BASH_ARGV0
export vXtrapArg0=()

    # înlocuitor BASH_ARGVC
export vXtrapArgC=()

# înlocuitor BASH_ARGV
# spațiu delimitat
exportați vXtrapArgV=()

    # înlocuire $?
export vXtrapRc=()

    # mesaj de înlocuire syserr
export vXtrapRcMsg=()

set +o verbose

citiți -rp '090'

#####
# Transferați inițierea comenzii inițiale în tabelul de urmărire revizuit
#####

i=0
iMax=${#BASH_LINENO[@]}
j=0
k=0
v=''

printf '\n'
v="$BASH_SUBSHELL"
dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
    ecou „$BASH_SUBSHELL dezactivat” „$BASH_SUBSHELL”
altfel
    echo „$BASH_SUBSHELL set” „$BASH_SUBSHELL”
fi

v="$LINENO"
dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
    ecou „$LINENO dezactivat” „$LINENO”
altfel
    echo '$LINENO setează '"$LINENO"
fi

v="$BASH_COMMAND"
dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
    ecou „$BASH_COMMAND dezactivat” „$BASH_COMMAND”
altfel
    echo „$BASH_COMMAND set” „$BASH_COMMAND”
fi

pentru (( i=0; i<=iMax; i++ ))
do
    printf '\n'

    v="${BASH_SOURCE["$i"]}"
    dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
        echo '${BASH_SOURCE['"$i"']} dezactivat '"${BASH_SOURCE[$i]}"
    altfel
        echo '${BASH_SOURCE['"$i"']} setează '"${BASH_SOURCE[$i]}"
    fi

    v="${FUNCNAME[$i]}"
    dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
        echo '${FUNCNAME['"$i"']} dezactivat „${FUNCNAME[$i]}”
    altfel
        echo '${FUNCNAME['"$i"']} setează '"${FUNCNAME[$i]}"
    fi

    v="${BASH_LINENO["$i"]}"
    dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
        echo '${BASH_LINENO['"$i"']} dezactivat '"${BASH_LINENO[$i]}"
    altfel
        echo '${BASH_LINENO['"$i"']} setează '"${BASH_LINENO[$i]}"
    fi

    v="${BASH_ARGV0[i]}"
    dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
        echo '${BASH_ARGV0['"$i"']} unset '"${BASH_ARGV0[$i]}"
    altfel
        echo '${BASH_ARGV0['"$i"']} setează '"${BASH_ARGV0[$i]}"
    fi

    v="${BASH_ARGC[i]}"
    dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
        echo '${BASH_ARGC['"$i"']} unset '"${BASH_ARGC[$i]}"
    altfel
        echo '${BASH_ARGC['"$i"']} setează '"${BASH_ARGC[$i]}"
    fi

    j=0
    în timp ce [ "$j" -lt "${BASH_ARGC[i]}" ]
    do

        v="${BASH_ARGV["$k"]}"
        dacă [[ -z „$v” && -n „${v-_}” ]]; atunci
            echo '${BASH_ARGV['"$i $j"']} unset ref=${BASH_ARGV['"$k"']} '"${BASH_ARGV["$k"]}"
        altfel
            echo '${BASH_ARGV['"$i $j"']} set ref=${BASH_ARGV['"$k"']} '"${BASH_ARGV["$k"]}"
        fi
        (( k++ ))
        (( j++ ))
    Terminat
Terminat

vPtrapScr="$(nume de bază "${BASH_SOURCE[0]}" '.sh' )"

vPtrapArgC='1'
vPtrapArgV=''
în timp ce [ $vPtrapArgC -lt ${BASH_ARGC[0]} ]
do
    cazul „$vPtrapArgC” în
        (0)
            vPtrapArgV=" \"${BASH_ARGV["vPtrapArgC"]}\""
            ;;

        (*)
            vPtrapArgV=" \"${BASH_ARGV["$vPtrapArgC"]}\"$vPtrapArgV"
            ;;
    esac


    (( vPtrapArgC++ ))
Terminat

    # Nu știu de ce este FUNCNAME[0] după noul terminal 
    # '' în loc de 'sursă'
### vPtrapArg0="${FUNCNAME[0]}"
vPtrapArg0='sursa'

vPtrapCmd="sursa \"${BASH_SOURCE[0]}\" ${vPtrapArgV}"

vPtrapArgV="\"${BASH_SOURCE[0]}\" ${vPtrapArgV}"

set -o xtrace

vXtrapSub=( „$BASH_SUBSHELL” „$BASH_SUBSHELL” „$BASH_SUBSHELL” )
vXtrapSrc=( „${BASH_SOURCE[0]}” '' '' )
vXtrapScr=( „$vPtrapScr” '' '' )
vXtrapFNm=( '' '' '' )
vXtrapLNo=( '0' "${BASH_LINENO[0]}" '0' )
vXtrapLNI=( '0' '0' '0' )
    # valorile de sub această linie sunt în prezent pentru instrucțiunea de apelare
    # când se activează capcana DEBUG, acestea vor fi instrucțiunile de script curente
vXtrapCmd=( „$vPtrapCmd” „$vPtrapCmd” '' )
vXtrapArg0=( „$vPtrapArg0” „$vPtrapArg0” '' )
vXtrapArgC=( „$vPtrapArgC” „$vPtrapArgC” „0” )
vXtrapArgV=( „$vPtrapArgV” „$vPtrapArgV” '' )
vXtrapRc=( '0' '0' '0' )
vXtrapRcMsg=( '' '' '' )

set +o xtrace

citiți -rp '100'

dezinstalat i
dezactivați iMax
dezactivat j
dezactivat k
dezactivat v
dezactivați vPtrapScr
dezactivați vPtrapCmd
dezactivați vPtrapArg0
dezactivați vPtrapArgC
dezactivați vPtrapArgV

citiți -rp '110'


returnează „${vXtrapRc[0]}”


Prima rulare +u a setat variabile aceleași variabile devin nesetate (în special $FUNCNAME care împiedică testarea multor dintre celelalte) în rularea -u.
Ieșirea de testare:

ubuntu@ubuntu:/$ set +u
ubuntu@ubuntu:/$ cd /pool/src/trap/scr
ubuntu@ubuntu:/pool/src/trap/scr$ sursă SHtest.sh

        # vXtrap Field Separator u0081 (plus/minus)
### export vXtrapLFS='\v'

        # înlocuitor BASH_SUBSHELL
exportați vXtrapSub=()

        # înlocuitor BASH_SOURCE
export vXtrapSrc=()

        # Script de înlocuire
        # nume de bază „${vXtrapSub[$lIdx]}}” „.sh”
export vXtrapScr=()

        # înlocuitor FUNCNAME
export vXtrapFNm=()

        # LINENO de înlocuire 
        # unde BASH_LINENO[lIdx] ar trebui să fie egal cu vXtrapLNo[lIdx+1]
export vXtrapLNo=()

        # LINENO inițiere
        # de linie raportul inițial al funcției în Debug Trap
export vXtrapLNI=()

        # înlocuitor BASH_COMMAND
        # aceasta este comanda sursă originală nesubstituită
        # următoarea este o versiune substituită comprimată a comenzii sursă
        # „${vXtrcTrapArg0[$lIdx]} ${vXtrcTrapArgV[$lIdx]}”
exportați vXtrapCmd=()

        # înlocuitor BASH_ARGV0
export vXtrapArg0=()

        # înlocuitor BASH_ARGVC
export vXtrapArgC=()

# înlocuitor BASH_ARGV
# spațiu delimitat
exportați vXtrapArgV=()

        # înlocuire $?
export vXtrapRc=()

        # mesaj de înlocuire syserr
export vXtrapRcMsg=()

set +o verbose
090

$BASH_SUBSHELL setează 0
$LINENO set 89
$BASH_COMMAND setează ecoul „$BASH_COMMAND” setează „$BASH_COMMAND”

${BASH_SOURCE[0]} setează SHtest.sh
Setat ${FUNCNAME[0]}      
${BASH_LINENO[0]} set 3
${BASH_ARGV0[0]} setează /usr/bin/bash
${BASH_ARGC[0]} set 1
${BASH_ARGV[0 0]} set ref=${BASH_ARGV[0]} SHtest.sh

Setat ${BASH_SOURCE[1]}      
Setat ${FUNCNAME[1]}      
${BASH_LINENO[1]} set      
Setat ${BASH_ARGV0[1]}      
${BASH_ARGC[1]} setează 0
++:SHtest.sh::184::x:: vXtrapSub=(„$BASH_SUBSHELL” „$BASH_SUBSHELL” „$BASH_SUBSHELL”)
++:SHtest.sh::185::x:: vXtrapSrc=("${BASH_SOURCE[0]}" '' '')
++:SHtest.sh::186::x:: vXtrapScr=(„$vPtrapScr” '' '')
++:SHtest.sh::187::x:: vXtrapFNm=('' '' '')
++:SHtest.sh::188::x:: vXtrapLNo=('0' „${BASH_LINENO[0]}” „0’)
++:SHtest.sh::189::x:: vXtrapLNI=('0' '0' '0')
++:SHtest.sh::192::x:: vXtrapCmd=("$vPtrapCmd" "$vPtrapCmd" '')
++:SHtest.sh::193::x:: vXtrapArg0=("$vPtrapArg0" "$vPtrapArg0" '')
++:SHtest.sh::194::x:: vXtrapArgC=(„$vPtrapArgC” „$vPtrapArgC” „0”)
++:SHtest.sh::195::x:: vXtrapArgV=("$vPtrapArgV" "$vPtrapArgV" '')
++:SHtest.sh::196::x:: vXtrapRc=('0' '0' '0')
++:SHtest.sh::197::x:: vXtrapRcMsg=('' '' '')
++:SHtest.sh::199::x:: set +o xtrace
100
110
ubuntu@ubuntu:/pool/src/trap/scr$ set -u
ubuntu@ubuntu:/pool/src/trap/scr$ sursă SHtest.sh

        # vXtrap Field Separator u0081 (plus/minus)
### export vXtrapLFS='\v'

        # înlocuitor BASH_SUBSHELL
exportați vXtrapSub=()

        # înlocuitor BASH_SOURCE
export vXtrapSrc=()

        # Script de înlocuire
        # nume de bază „${vXtrapSub[$lIdx]}}” „.sh”
export vXtrapScr=()

        # înlocuitor FUNCNAME
export vXtrapFNm=()

        # LINENO de înlocuire 
        # unde BASH_LINENO[lIdx] ar trebui să fie egal cu vXtrapLNo[lIdx+1]
export vXtrapLNo=()

        # LINENO inițiere
        # de linie raportul inițial al funcției în Debug Trap
export vXtrapLNI=()

        # înlocuitor BASH_COMMAND
        # aceasta este comanda sursă originală nesubstituită
        # următoarea este o versiune substituită comprimată a comenzii sursă
        # „${vXtrcTrapArg0[$lIdx]} ${vXtrcTrapArgV[$lIdx]}”
exportați vXtrapCmd=()

        # înlocuitor BASH_ARGV0
export vXtrapArg0=()

        # înlocuitor BASH_ARGVC
export vXtrapArgC=()

# înlocuitor BASH_ARGV
# spațiu delimitat
exportați vXtrapArgV=()

        # înlocuire $?
export vXtrapRc=()

        # mesaj de înlocuire syserr
export vXtrapRcMsg=()

set +o verbose
090

$BASH_SUBSHELL setează 0
$LINENO set 89
$BASH_COMMAND setează ecoul „$BASH_COMMAND” setează „$BASH_COMMAND”

${BASH_SOURCE[0]} setează SHtest.sh
bash: FUNCNAME[$i]: variabilă nelegată
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapSub=(„$BASH_SUBSHELL” „$BASH_SUBSHELL” „$BASH_SUBSHELL”)
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapSrc=("${BASH_SOURCE[0]}" '' '')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapScr=("$vPtrapScr" '' '')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapFNm=('' '' '')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapLNo=('0' „${BASH_LINENO[0]}” „0”)
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapLNI=('0' '0' '0')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapCmd=("$vPtrapCmd" "$vPtrapCmd" '')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapArg0=("$vPtrapArg0" "$vPtrapArg0" '')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapArgC=(„$vPtrapArgC” „$vPtrapArgC” „0”)
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapArgV=("$vPtrapArgV" "$vPtrapArgV" '')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapRc=('0' '0' '0')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: vXtrapRcMsg=('' '' '')
bash: FUNCNAME[0]: variabilă nelegată
++:${BASH_SOURCE[0]}:${FUNCNAME[0]}:${LINENO[0]}::x:: set +o xtrace
100
110
ubuntu@ubuntu:/pool/src/trap/scr$

Sper că acest cod și rezultat are sens pentru cei care îl citesc.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.