Я не могу понять, почему следующее действие возвращает код 1.
echo 'Total' | grep -c No
0
Итак, "No" не существует в "Total". Но затем, просматривая его код возврата, я вижу, что он равен 1.
echo $?
1
Почему код возврата отображается как 1? Есть ли способ обойти это?
Согласно странице man grep
, флаг -c
предназначен для
-c, --count Подавить нормальный вывод; вместо этого вывести счетчик совпадающих строк для каждого входного файла.
Таким образом, то, что вы видите - это счетчик совпадений, и его не следует путать с кодом завершения работы grep
. Код 1
- это потому, что из входных данных не было найдено ни одной совпадающей строки.
Взгляните на другой случай,
echo 'No' | grep -c No
1
echo $?
0
Также читайте о EXIT CODES
на странице man grep
,
СТАТУС ВЫХОДА Обычно статус выхода равен 0, если выбрана строка, 1, если не выбрано ни одной строки, и 2, если произошла ошибка.
Код выхода равен 1, потому что grep ничего не нашел.
СТАТУС ВЫХОДА Статус выхода равен 0, если выбранные строки найдены, и 1, если не найдены. Если произошла ошибка, статус выхода равен 2. (Примечание: обработка ошибок POSIX. код должен проверять наличие '2' или больше).
Вывод равен нулю, потому что счетчик 'Total' равен нулю. Это связано с опцией -c:
-c, --count Подавить обычный вывод; вместо этого вывести счетчик совпадающих строк для каждого входного файла. С опцией -v, --invert-match (см. ниже), подсчитываются несовпадающие строки. (Опция -c определена POSIX).
Если вы хотите, чтобы код выхода был равен 0, вы можете просто добавить ||| true
к вашей команде:
echo 'Total' | grep -c No || true