Você não pode armazenar dados binário (dados binários geralmente se referem a dados com valores de byte arbitrários, não apenas valores de byte que formam caracteres válidos, mas não são especiais) em bash
variables as bash
não suporta o armazenamento do valor de 0
byte em suas variáveis (e lembre-se de que você não pode passar tais strings em argumentos para comandos como são strings delimitadas por NUL).
Você pode em zsh
embora. Lembre-se também que a substituição de comandos retira caracteres de nova linha (0xa bytes, talvez diferentes no Cygwin), então é melhor usar read
aqui:
$ echo 323 | openssl dgst -sha1 -binary | hd
00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......a.T.E|
00000010 63 4b 37 b0 |cK7.|
00000014
Veja como isso contém um caractere de 0 byte e nova linha (0xa)
$ echo 323 | openssl dgst -sha1 -binary | IFS= LC_ALL=C read -ru0 -k20 var &&
var=${var}World
$ printf %s $var | hd
00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......a.T.E|
00000010 63 4b 37 b0 57 6f 72 6c 64 |cK7.World|
00000019
Note novamente que você só pode passar essa variável para os comandos incorporados ( printf
...).
Agora, se tudo o que você quer é fazer hash novamente, então é só
(echo 323 | openssl dgst -sha1 -binary; printf %s World) |
openssl dgst -sha1 -binary
não há necessidade de uma variável.