
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
결과를 사용하여 저장하여 발생한 경고 메시지의 즉각적인 문제를 해결하는 것입니다. 그러나 개행 문자가 포함된 파일 이름은 여전히 깨질 수 있으므로 논리에 결함이 남습니다.
배열을 사용하고 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
%