Os utilitários da shell projetados para operar em texto (como cat
, cut
, sort
, tail
, etc.) exigem que sua entrada seja um arquivo de texto. Um arquivo de texto, em termos Unix:
- consiste apenas em caracteres válidos na localidade do ambiente (
LC_CTYPE
locale setting), além do byte nulo; - consiste em uma sequência de linhas, cada uma terminada por um caractere de nova linha (
\n
, a.k.a. feed de linha).
Esse segundo ponto implica que qualquer arquivo não vazio termina com um caractere de nova linha.
O que acontece se a entrada não for um arquivo de texto depende do utilitário. Sistemas Unix antigos tendiam a ignorar o texto em uma linha após um byte nulo e ignorar toda ou parte da última linha incompleta (texto após o último caractere de nova linha). As versões GNU sempre tratam os bytes nulos como um caractere comum e passam principalmente por seqüências de bytes inválidos. As versões GNU sempre processam toda a entrada mesmo se a nova linha final estiver faltando, mas elas diferem em adicionar uma nova linha à direita em sua saída. Por exemplo, GNU cat
sempre passa sua entrada inalterada, mas muitos outros, incluindo cut
, sempre imprimem uma nova linha no final de cada linha de saída, incluindo a última.
Então, quando você produz a entrada de referência, é preciso suprimir a nova linha à direita no último minuto.
echo 03112016 | cut -d'.' -f4 | tr -d '\n' | sha256sum
ou apenas
echo -n 03112016 | sha256sum