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.