
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 em 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
no\0
encontrarcomando neste exato caso, mas gostaria de saber como, se possível, fazê-lo com o delimitador NUL de modo 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 preciso fazer um loop várias vezes, isso cria um código muito redundante - e teria que executar oencontrareorganizarcomando de cada vez.
Converter o resultado em um array, talvez?
- Isso é possível?
- Por que os dados delimitados por NUL não podem ser usados como estão?
Responder1
É um fato que você não pode armazenar \0
bytes nulos em um contexto de string bash, devido à implementação C subjacente. VerPor que $'\0' ou $'\x0' é uma string vazia? Deveria 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 armazenando 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 estariam quebrados.
Use uma matriz, use o comando mapfile
ou readarray
(no bash 4.4+) para obter diretamente os resultados do find
comando
IFS= readarray -t -d '' samples < <(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)
Responder2
O bash
shell não suporta o que você deseja fazer. O zsh
shell sai da caixa.
% mkdir sample11 SAMple12 sample21 sample22 dir1
% ll
total 20
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 dir1
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 sample11
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 SAMple12
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 sample21
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 sample22
% samples=$(find . -type d -iregex './sample[0-9][0-9]' -print0 | sort -z)
% echo $samples
./sample11./SAMple12./sample21./sample22
% echo $samples | od -a
0000000 . / s a m p l e 1 1 nul . / S A M
0000020 p l e 1 2 nul . / s a m p l e 2 1
0000040 nul . / s a m p l e 2 2 nul nl
0000055
%