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
결과를 사용하여 파이프 끝에 저장하여 경고 메시지를 던지는 즉각적인 문제를 해결하는 것입니다. 그러나 줄바꿈이 포함된 파일 이름은 여전히 엉망이 되기 때문에 여전히 논리에 결함이 있습니다.
배열을 사용하면 mapfile
or 명령(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
%