Shell-утилиты, предназначенные для работы с текстом (такие как cat
, cut
, sort
, tail
и т.д.), требуют, чтобы их входными данными были текстовые файлы. Текстовый файл, в терминах Unix:
LC_CTYPE
установка локали), кроме нулевого байта;\n
, он же перевод строки). Из этого второго пункта следует, что любой непустой файл заканчивается символом новой строки.
Что происходит, если входные данные не являются текстовым файлом, зависит от утилиты. Старые системы Unix, как правило, игнорировали текст в строке после нулевого байта, а также игнорировали всю или часть последней неполной строки (текст после последнего символа новой строки). Версии GNU всегда рассматривают нулевой байт как обычный символ и в основном пропускают недопустимые последовательности байтов. Версии GNU всегда обрабатывают весь входной текст, даже если последняя новая строка отсутствует, но они различаются тем, добавляют ли они в свой выходной текст завершающую новую строку. Например, GNU cat
всегда пропускает входные данные без изменений, но многие другие, включая cut
, всегда печатают новую строку в конце каждой выходной строки, включая последнюю.
Поэтому, когда вы производите эталонный ввод, вам нужно подавить концевую новую строку в последний момент.
echo 03112016 | cut -d'.' -f4 | tr -d '\n' | sha256sum
или просто
echo -n 03112016 | sha256sum