Mirando el BASH manpage en el set -e
:
Salir inmediatamente si una orden simple (ver SHELL gramática anterior) sale con un estado distinto de cero. [...]
Por lo tanto, si alguna instrucción devuelve un código de salida distinto de cero, el shell se cerrará.
Echando un vistazo a la BASH manpage, en el comando let
:
Si el último arg evalúa a 0, dejar que devuelve 1; 0 se devuelve de lo contrario.
¡Pero espera! ¡La respuesta a i++
es una y no un cero! Debería haber funcionado!
Una vez más, la respuesta es con la página de manual BASH en el operador de incremento:
Identificación ++ id--: variable de post-incremento y de decremento posterior
bien, no está tan claro. Probar este script de shell:
#!/bin/bash
set -e -v
i=1; let ++i; echo "I am still here"
i=0; let ++i; echo "I am still here"
i=0; ((++i)); echo "I am still here"
Hmmm ... eso funciona como se esperaba, y lo único que hice fue el cambio i++
-++i
en cada línea.
El i++
es un operador de incremento posterior. Eso significa que incrementa i
después de la declaración let
devuelve un valor. Dado que i
era cero antes de que se incrementara, la instrucción let
devuelve un valor distinto de cero.
Sin embargo, ++i
es un operador de preincremento . Eso significa que incrementa i
antes de devolver el estado de salida. Como i
se incrementa a 1
, el estado de salida se convierte en cero.
Espero que esto tenga sentido.
Nunca hubiera imaginado que un incremento de aspecto inofensivo hubiera tenido esta interacción involuntaria con 'set -e'. Afortunado, encontré esta pregunta. –