NUL로 구분된 변수

NUL로 구분된 변수

GNU bash, 버전 4.4.19(1)-릴리스(x86_64-pc-linux-gnu)

아이디어는 변수를 NUL로 구분된 데이터 세트로 설정하는 것입니다. 여기$samples

그러나 결과는 다음과 같습니다.

경고: 명령 대체: 입력에서 null 바이트를 무시합니다.

다음과 같이 취급:

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

동일한 값을 여러 번 반복해야 하기 때문에 이 변수를 재사용할 수 있다고 생각했습니다.

while IFS= read -rd '' sample; do
    echo $sample
done<<< "$samples"

나도 \n들어갈 수 있어\0찾다이 경우 명령을 실행하지만 가능하다면 NUL 구분 기호를 사용하여 이 작업을 수행하는 일반적인 방법을 알고 싶습니다.

나는 다음을 선택할 수 있습니다.

while IFS= read -rd '' sample; do
    echo $sample
done< <(find . -type d -iregex './E[0-9][0-9]' -printf "%f\0" | sort -z)

하지만 - 몇 번 반복해야 하기 때문에 매우 중복되는 코드가 생성되고 실행되어야 합니다.찾다그리고유형매번 명령을 내리십시오.

결과를 배열로 변환할까요?


  • 가능합니까?
  • NUL을 사용하여 데이터를 있는 그대로 분리할 수 없는 이유는 무엇입니까?

답변1

실제로 \0기본 C 구현으로 인해 bash 문자열 컨텍스트에 null 바이트를 저장할 수 없습니다. 바라보다$'\0' 또는 $'\x0'이 빈 문자열인 이유는 무엇입니까? null 문자여야 합니다. 그렇죠?.

한 가지 옵션은 sort 명령 후에 null 바이트를 제거하고 tr결과를 사용하여 파이프 끝에 저장하여 경고 메시지를 던지는 즉각적인 문제를 해결하는 것입니다. 그러나 줄바꿈이 포함된 파일 이름은 여전히 ​​엉망이 되기 때문에 여전히 논리에 결함이 있습니다.

배열을 사용하면 mapfileor 명령(bash 4.4+에서)을 사용하여 명령 readarray결과를 직접 얻을 수 있습니다.find

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

답변2

쉘은 bash당신이 원하는 것을 지원하지 않습니다. 케이스는 zsh상자에서 꺼내 바로 사용할 수 있는 상태로 제공됩니다.

% 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
%

관련 정보