Код возврата grep Linux

Я пытаюсь понять, почему следующее возвращает код 1.

echo 'Total' | grep -c No
0

Так что "Нет" в "Всего" не существует. Но затем, глядя на его код возврата, я вижу его как 1.

echo $?
1

Почему код возврата отображается как 1? Есть ли способ обойти это?

Ответ 1

Согласно man grep странице, флаг -c предназначен для

-c, --count               Подавлять нормальный выход; вместо этого напечатайте количество совпадающих строк для каждого входного файла.

Итак, вы видите счетчик совпадения и не путаетесь с кодом выхода grep. Код 1 вызван отсутствием строк, соответствующих входу.

Посмотрите на другой случай,

echo 'No' | grep -c No
1

echo $?
0

Также читайте на EXIT CODES на странице man grep,

СОСТОЯНИЕ ВЫХОДА        Обычно статус выхода равен 0, если выбрана линия, 1, если линии не выбраны, и 2, если произошла ошибка.

Ответ 2

Код выхода равен 1, потому что grep ничего не совпало.

СТАТУС ВЫХОДА Статус выхода - 0, если выбранные строки найдены, и 1, если не найдены. Если произошла ошибка, статус выхода равен 2. (Примечание. Код обработки ошибок POSIX должен проверять значение "2" или более.)

Выход равен нулю, потому что счетчик "Всего" равен нулю. Это связано с опцией -c:

-c, - -c ount Подавить нормальный выход; вместо этого выведите количество совпадающих строк для каждого входного файла. С помощью опции -v, --invert-match (см. Ниже), подсчитайте несовпадающие строки. (-c определяется POSIX.)

Если вы хотите принудительно установить код выхода 0, вы можете просто добавить || true || true вашей команде:

echo 'Total' | grep -c No || true