Este script no hace eco "después":
#!/bin/bash -e
echo "before"
echo "anything" | grep e # it would if I searched for 'y' instead
echo "after"
exit
También lo haría si eliminara la -eopción en la línea shebang, pero deseo mantenerla para que mi script se detenga si hay un error. No considero que grep no encuentre coincidencias como un error. ¿Cómo puedo evitar que salga tan abruptamente?
bash
grep
exit
error-handling
iago-lito
fuente
fuente

-epresuponer que te importa: tanto, que cualquier problema es catastrófico.var=$(complex command | grep complex_pattern)cual puede ser nulo (en cuyo caso mi programa no debería finalizar). Esto es solo un script resumido que hace que ocurra el problema. No hay un agujero negro metafísico en la lógica aquí, ¿verdad? ;)Respuestas:
Explicación:
El "||" significa "o". Si la primera parte del comando "falla" (que significa "grep e" devuelve un código de salida distinto de cero), entonces la parte después de "||" se ejecuta, tiene éxito y devuelve cero como el código de salida (
truesiempre devuelve cero).fuente
/bin/truees:command || :(en su caso,set -e; grep 'needle' haystack || :).trueestá integrado en algunos shells (al menosbash 4.3en RHEL)Una forma sólida de enviar mensajes de forma segura y opcional
grep:Según el manual posix , el código de salida 1 significa que no hay líneas seleccionadas y> 1 significa un error.
fuente
Otra opción es agregar otro comando a la tubería, uno que no falle:
echo "anything" | grep e | catDebido a
catque ahora es el último comando en la tubería, es el estado de salida decat, no degrep, el que se usará para determinar si la tubería falló o no.fuente
Otra opción:
fuente
Solución
Explicación
set -eoset -o errexitAdemás,
:es el comando sin efecto en Bash.fuente