GNU bash, versão 4.4.19(1)-release (x86_64-pc-linux-gnu)
A ideia é definir uma variável para um conjunto de dados delimitado por NUL. Aqui$samples
Isso, no entanto, resulta em:
aviso: substituição de comando: byte nulo ignorado na entrada
ao fazer:
samples="$(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)"
Pensei que poderia reutilizar essa variável, pois preciso iterar os mesmos valores várias vezes:
while IFS= read -rd '' sample; do
echo $sample
done<<< "$samples"
Eu poderia usar \n
over \0
no comando find neste caso exato, mas gostaria de saber como, se possível, fazê-lo com o delimitador NUL em geral.
Opcionalmente eu poderia fazer:
while IFS= read -rd '' sample; do
echo $sample
done< <(find . -type d -iregex './E[0-9][0-9]' -printf "%f\0" | sort -z)
mas - como eu preciso fazer um loop várias vezes, isso cria um código muito redundante - e teria que executar o comando find and sort a cada vez.
Converter o resultado em uma matriz, talvez?
- Isso é possível?
- Por que os dados delimitados por NUL não podem ser usados como estão?
É um fato que você não pode armazenar
\0
bytes nulos em um contexto de string bash, por causa da implementação C subjacente. Consulte Por que $'\0' ou $'\x0' é uma string vazia? Deve ser o caractere nulo, não é? .Uma opção seria retirar os bytes nulos após o comando sort, no final do pipeline usando
tr
e armazenar o resultado para resolver o problema imediato da mensagem de aviso lançada. Mas isso ainda deixaria sua lógica falha, pois os nomes de arquivos com novas linhas ainda seriam quebrados.Use uma matriz, use o comando
mapfile
oureadarray
(no bash 4.4+) para absorver diretamente os resultados dofind
comandoO
bash
shell não suporta o que você deseja fazer. Azsh
casca sai da caixa.