As diferenças não vêm do SHA1, mas da entrada. A sintaxe here-string acrescenta uma nova linha, como podemos ver com od
:
$ od -c <<< foo
0000000 f o o \n
Portanto, no seu comando git
, a entrada é os dez caracteres Apple Pie\n
.
Além disso, as aspas duplas usadas nas strings here não suportam escapes de barra invertida como \n
ou \nnn
, então <<< "blob 9
fornece uma string contendo uma barra invertida literal e um zero. printf
Apple Pie"
no entanto interpreta $''
como o byte NUL, e não adiciona uma nova linha à direita, então com a nova linha adicionada e o tamanho fixo, devemos obter a saída esperada: zsh
$ printf 'blob 10$ zsh -c "sha1sum <<< $'blob 10$ od -c <<< foo
0000000 f o o \n
Apple Pie'"
23991897e13e47ed0adb91a0082c31c82fe0cbe5 -
Apple Pie\n' | sha1sum
23991897e13e47ed0adb91a0082c31c82fe0cbe5 -
Poderíamos tentar fazer o mesmo com a string here usando o %code% quote que suporta %code% representando o byte NUL, mas isso pode não funcionar em todos os shells, pois o byte NUL termina a string. Por exemplo. Bash não pode lidar com isso, %code% can:
$ printf 'blob 10$ zsh -c "sha1sum <<< $'blob 10%pre%Apple Pie'"
23991897e13e47ed0adb91a0082c31c82fe0cbe5 -
Apple Pie\n' | sha1sum
23991897e13e47ed0adb91a0082c31c82fe0cbe5 -