Variable delimitada NUL

Variable delimitada NUL

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 \nen \0elencontrarcomando 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 \0bytes 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 try 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 mapfileo readarray(en bash 4.4+) para absorber directamente los resultados del findcomando

IFS= readarray -t -d '' samples < <(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)

Respuesta2

El bashshell no admite lo que quieres hacer. El zshcaparazó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
%

información relacionada