Estoy aprendiendo cómo usar de manera eficiente diferentes setopciones en mi script y descubrí set -uque parece ser perfecto para salir de mi script si una variable no se configura correctamente (por ejemplo, eliminar usuarios). De acuerdo con la página del manual , set -uy set -ehace lo siguiente ...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
Creé un script de prueba para probar esta funcionalidad, pero no parece funcionar como se esperaba. ¿Quizás alguien podría explicarme mejor mi problema y dónde estoy interpretando mal? El script de prueba está abajo. Gracias.
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Espero que el script muestre 0 y "Esto funciona" , y luego falla ya ${testing2}que no está configurado.
En su lugar, se muestra 0 y "Esto funciona" , siga 0 y luego 0 Esto no debería aparecer
¿Alguien puede proporcionar algún conocimiento? Gracias.
fuente

Respuestas:
De "man Bash":
Cuando lo hace
testing2=, está configurando la variable en la cadena nula.Cambie eso
unset testing2e intente nuevamente.El
set -eno ayuda en este caso ya que una asignación nunca tiene un código de salida de 1. Intente esto para ver que el último comando ejecutado (la asignación) tiene un código de salida de 0, o lea esta pregunta :Y también creo que el uso de set -e es más un problema que una solución.
Lo que puede obtener un error con el uso de variables no establecidas es
set -u:Saldrá:
fuente
testing2=establece latesting2variable en una cadena vacía; la variable en realidad está establecida .Sin embargo, si tuviera que ejecutar
echo $testing99un shell Bash interactivo (sin configuraciónerrexit, es decir,set -e), obtendría un error:Aparte
Mientras probaba los scripts en este momento, descubrí que un shell interactivo no siempre se cierra al intentar expandir una variable que no se ha establecido mientras que siempre sale un shell no interactivo (que ejecuta un script de shell) . De acuerdo con la página de manual de POSIX para :
setUn Bash shell interactivo no saldrá a menos que
errexittenga también ha establecido. Por otro lado, un shell de tablero interactivo no saldrá, incluso siset -ese ha ejecutado previamente.fuente