Этот скрипт не повторяет "после":
#!/bin/bash -e
echo "before"
echo "anything" | grep e # it would if I searched for 'y' instead
echo "after"
exit
Также было бы, если бы я удалил -e
опцию в строке shebang, но я хотел бы оставить ее, чтобы мой скрипт останавливался, если произошла ошибка. Я не считаю, что grep не находит совпадений как ошибку. Как я могу предотвратить такой резкий выход?
bash
grep
exit
error-handling
Яго-лито
источник
источник
-e
что вы заботитесь: настолько, что любая проблема будет катастрофической.var=$(complex command | grep complex_pattern)
которое может быть нулевым (в этом случае моя программа не должна завершаться). Это всего лишь сценарий, позволяющий решить проблему. Здесь нет никакой метафизической черной дыры в логике, верно? ;)Ответы:
Объяснение:
"||" означает «или». Если первая часть команды «терпит неудачу» (что означает «grep e» возвращает ненулевой код выхода), то часть после «||» выполняется, успешно и возвращает ноль в качестве кода выхода (
true
всегда возвращает ноль).источник
/bin/true
:command || :
(так в вашем случае,set -e; grep 'needle' haystack || :
).true
встроен в некоторые оболочки (по крайней мере,bash 4.3
на RHEL)Надежный способ безопасно и необязательно
grep
сообщения:Согласно инструкции posix , код выхода 1 означает, что строки не выбраны, а> 1 означает ошибку.
источник
Другой вариант - добавить в конвейер еще одну команду, которая не вызывает ошибок:
echo "anything" | grep e | cat
Поскольку
cat
теперь это последняя команда в конвейере, это статус выходаcat
, а не изgrep
, который будет использоваться для определения того, вышел ли конвейер из строя или нет.источник
Другой вариант:
источник
Решение
объяснение
set -e
илиset -o errexit
Плюс,
:
это команда без эффекта в Bash.источник