2014-02-19 3 views
4

У меня есть (длинный) Баш скрипт, сделать что-то вроде этого:Grep ошибки без сообщения об ошибке

set -o nounset 
set -o errexit 
set -o pipefail 

echo -e "foo \n bar" | grep "baz" | tr -d ' ' 

echo "here" 

Сценария терпит неудачу без сообщения об ошибке, потому что команда возвращает GREP ошибка 1 без печати никаких сообщений об ошибках.

Как сделать мой скрипт надежным?

+0

Из 'grep' страницы человека:" СОСТОЯНИЕ ВЫХОДА Утилита grep выходит с одним из следующих значений: 0 Выбрана одна или несколько линий. 1 Не выбрано линий. > 1 Произошла ошибка. " Таким образом, значение выхода 1 просто означает, что строка не найдена (как и ожидалось), а не произошла ошибка. – Evert

+0

Какой результат вы ожидаете в случае строки, не найденной в grep? – Bentoy13

+0

'grep' не пишет никакой ошибки, если совпадение не найдено. – anubhava

ответ

1

grep будет выдавать ненулевой код выхода, если шаблон не соответствует. Более того, он не выдал бы сообщение об ошибке. Чтобы получить сообщение об ошибке, если шаблон не найден на входе, вам понадобится альтернатива. Вы можете использовать awk:

echo -e "foo \n bar" | \ 
awk 'BEGIN{f=0}/baz/{f=1;print;}END{if (!f) {print "Error; string not found"; exit 1;}}' | \ 
tr -d ' ' 

Это будет вести себя очень похоже на grep (с точки зрения кода выхода) и будет производить сообщение об ошибке, если совпадение не найдено.

Для вывода сообщения об ошибке в STDERR, вы можете сказать:

echo -e "foo \n bar" | \ 
awk 'BEGIN{f=0}/baz/{f=1;print;}END{if (!f) {print "Error; string not found" > "/dev/stderr"; exit 1;}}' | \ 
tr -d ' ' 
1

Вы можете использовать grep -q и проверить его статус возврата:

if $(echo -e "foo \n bar" | grep -q "baz"); then 
    echo "grep success" 
else 
    echo "grep failure" 
fi 
Смежные вопросы