Если я запускаю diff -q
два файла, и они идентичны, код выхода, сгенерированный echo $?
; 0
если файлы различаются, код выхода 1
. Почему так? Каким образом первый является diff
успешным, а второй — неудачным?
Я использовал термины «успех» и «неудача», основываясь на моем чтении и ограниченном пониманииhttp://mywiki.wooledge.org/BashGuide/TestsAndConditionals:
- Статус выхода
Каждая команда приводит к коду выхода всякий раз, когда она завершается.
Этот код выхода используется любым приложением, которое ее запустило, чтобы оценить,
все ли прошло нормально. Этот код выхода похож на возвращаемое значение из
функций. Это целое число от 0 до 255 (включительно). Соглашение
гласит, что мы используем 0 для обозначения успеха и любое другое число для обозначения
неудачи какого-либо рода.Конкретное число полностью зависит от приложения.,
и используется для намека на то, что именно пошло не так.
Мне следовало бы дочитать man diff
до конца, где ясно изложены принятые разработчиками соглашения.
решение1
От man diff
:
Статус выхода — 0, если входы одинаковы, 1 — если разные, 2 — если возникла проблема.
Я открыто признаю, что это может быть не так.полностью стандартныйно коды выхода естьбольше того, что можно назвать «рекомендациями», чем фактическими правилами.
В этом случае отклонение от стандарта позволяет легко запускать diff
скрипты.
diff a b && echo "no difference" || echo "differences!"
Это похоже на grep
то, что выведет 0, если что-то найдено, и 1, если что-то не найдено. Я не могу объяснить ориентацию между 0 и 1 для diff
. Я предполагаю, что они использовали стандартные логические результаты C.
Это не имеет значения. Это просто произвольное число.
решение2
man diff
говорит нам
СТАТУС ВЫХОДА
The following exit values shall be returned:
0 No differences were found.
1 Differences were found.
>1 An error occurred.
Называя значениями выхода «успех» и «неудача», вы сами себя ограничиваете. У программ есть целых 8 бит для статуса выхода, значения от 0 до 255.