Considera los comandos
eval false || echo ok
echo also ok
Normalmente, esperaríamos que esto ejecute la falseutilidad y, dado que el estado de salida es distinto de cero, luego ejecutar echo oky echo also ok.
En todo el POSIX como conchas que utilizo ( ksh93, zsh, bash, dash, OpenBSD ksh, y yash), esto es lo que sucede, pero las cosas se ponen interesantes si permitimos set -e.
Si set -eestá vigente, OpenBSD shy kshshells (ambos derivados de pdksh) terminarán el script al ejecutar el eval. Ningún otro caparazón hace eso.
POSIX dice que un error en una utilidad incorporada especial (como eval) debería hacer que el shell no interactivo finalice. No estoy completamente seguro de si la ejecución falseconstituye "un error" (si lo fuera, sería independiente de set -eestar activo).
La forma de evitar esto parece ser poner evalun sub shell,
( eval false ) || echo ok
echo also ok
La pregunta es si se espera que tenga que hacer eso en un script de shell POSIX-ly correcto, o si es un error en el shell de OpenBSD. Además, ¿qué se entiende por "error" en el texto POSIX vinculado anteriormente?
Información adicional: los shells de OpenBSD ejecutarán echo okambos con y sin set -e el comando
eval ! true || echo ok
Mi código original parecía
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
lo que no la salida not okcon string=falseel uso de las conchas de OpenBSD (sería terminar), y no estaba seguro de que era por diseño, por error o por mala interpretación, o alguna otra cosa.
eval falseterminar el script incluso si es parte de una lista AND-OR o una declaración condicional? Yo no lo haría
set -ese establece si ese es el comportamiento correcto ... Estoy de acuerdo en que tiene sentido no terminar en una declaración condicional.
set -epor lo que `()` es la respuesta.
eval falsegenera un estado distinto de cero, por lo que esperaríaset -eterminar el script en ese punto. En el caso de!set -eno se aplica, ya que la!declaración verifica explícitamente el estado de salida.