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 -e
opció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
-e
presuponer 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 (
true
siempre devuelve cero).fuente
/bin/true
es:command || :
(en su caso,set -e; grep 'needle' haystack || :
).true
está integrado en algunos shells (al menosbash 4.3
en 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 | cat
Debido a
cat
que 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 -e
oset -o errexit
Además,
:
es el comando sin efecto en Bash.fuente