Estoy aprendiendo cómo usar de manera eficiente diferentes set
opciones en mi script y descubrí set -u
que 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 -u
y set -e
hace 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 testing2
e intente nuevamente.El
set -e
no 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 latesting2
variable en una cadena vacía; la variable en realidad está establecida .Sin embargo, si tuviera que ejecutar
echo $testing99
un 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 :
set
Un Bash shell interactivo no saldrá a menos que
errexit
tenga también ha establecido. Por otro lado, un shell de tablero interactivo no saldrá, incluso siset -e
se ha ejecutado previamente.fuente