
GNU bash, versión 4.4.19(1) (x86_64-pc-linux-gnu)
La idea es establecer una variable en un conjunto de datos delimitado por NUL. Aquí$samples
Esto, sin embargo, resulta en:
Advertencia: sustitución de comando: byte nulo ignorado en la entrada
al hacer:
samples="$(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)"
Pensé que podría reutilizar esta variable ya que necesito iterar los mismos valores varias veces:
while IFS= read -rd '' sample; do
echo $sample
done<<< "$samples"
Me vendría bien \n
en \0
elencontrarcomando en este caso exacto, pero me gustaría saber cómo, si es posible, hacerlo con el delimitador NUL en términos generales.
Opcionalmente podría hacer:
while IFS= read -rd '' sample; do
echo $sample
done< <(find . -type d -iregex './E[0-9][0-9]' -printf "%f\0" | sort -z)
pero, como necesito repetirlo varias veces, genera un código muy redundante y tendría que ejecutar elencontraryclasificarcomando cada vez.
¿Quizás convertir el resultado en una matriz?
- es posible?
- ¿Por qué no se pueden utilizar los datos delimitados por NUL tal como están?
Respuesta1
Es un hecho que no se pueden almacenar \0
bytes nulos en un contexto de cadena bash, debido a la implementación subyacente de C. Ver¿Por qué $'\0' o $'\x0' es una cadena vacía? Debería ser el carácter nulo, ¿no?.
Una opción sería eliminar los bytes nulos después del comando de clasificación, al final de la canalización, usar tr
y almacenar el resultado para resolver el problema inmediato del mensaje de advertencia emitido. Pero eso aún dejaría su lógica defectuosa ya que los nombres de archivos con nuevas líneas aún estarían rotos.
Use una matriz, use el comando mapfile
o readarray
(en bash 4.4+) para absorber directamente los resultados del find
comando
IFS= readarray -t -d '' samples < <(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)
Respuesta2
El bash
shell no admite lo que quieres hacer. El zsh
caparazón sale de la caja.
% 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
%