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 문자여야 하지 않나요?.

한 가지 옵션은 파이프라인 끝에서 정렬 명령 후 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
%

관련 정보