O Bash não suporta bytes nulos em variáveis. foo=$(cat file)
faz com que $foo
contenha o início do arquivo, até o primeiro byte nulo. A substituição de comando também remove todas as novas linhas finais do arquivo. Por exemplo, se o arquivo consistir em quatro bytes ( a
, nova linha, nova linha, nova linha), então foo
conterá apenas a
, o mesmo que se o arquivo contivesse apenas esse byte.
Se você quiser preservar as novas linhas finais, providencie para que o comando imprima um caractere extra de não-nova linha e, em seguida, retire-o.
foo=$(cat file; echo a)
foo=${foo%a}
Até agora, tudo isso funcionou em todos os shells do estilo Bourne / POSIX (ash, ksh, bash,…). O Bash ≥4.0 tem uma maneira mais rápida de ler um arquivo em uma variável: o mapfile
.
mapfile <file foo
Simplesmente não há como inserir um byte nulo em uma variável bash. Se você quiser isso, você tem várias opções:
- Use zsh.
- Use Perl.
- Armazene os dados em um arquivo temporário (que parece inútil aqui, pois os dados já estão em um arquivo).
- Codifique a entrada e decodifique-a de volta, por exemplo com
base64
ebase64 -d
.