(참고: 이 두 가지 예는가능한GNU 또는 BSD가 필요하며 find
POSIX "버전"에서는 있는 그대로 작동하지 않을 수 있습니다 find
.
다음 두 스크립트는 다음과 같이 이해되어야 합니다.발췌더 복잡한 스크립트에서는 요점이 몇 줄로 압축됩니다.
내가 얻을 때정확히 똑같다두 변형에 대한 결과, 이 두 구현의 차이점(각각: 함정)이 어디에 있는지 궁금합니다.
- 변종 1
while IFS= read -r f; do
echo "reading entry: "$f""
done < <(find ~/workdocs -type f -name '*.pdf' -print)
- 변종 2
while IFS= read -rd '' f; do
echo "reading entry: "$f""
done < <(find ~/workdocs -type f -name '*.pdf' -print0)
그것은 밝혀졌다산출(이 질문은 바로 이것이다) 완전히정확히 똑같다두 경우 모두. (출력 로그 파일로 리디렉션한 다음 diff
둘 다 테스트하여 테스트했습니다.)
그러나 어떤 것이 있는지 궁금합니다.엣지 케이스이로 인해 실제로 변형 #1과 #2의 출력이 달라질 수 있습니다.
그것이 내가 알고 싶은 것입니다.
답변1
이해와 가시성을 높이기 위해 답변의 설명 인용 섹션을 남용했습니다. SE 카르마가 나를 용서해주기를…
이는 (내용에 따라 f
) 특별한 경우이며 문제를 확인하기가 쉽지 않습니다.
> f=foo
> set -x
> echo "reading entry: "$f""
+ echo 'reading entry: foo'
reading entry: foo
셸 디버그 모드에서는 문자열만 표시됩니다. 하지만 그건아니요"중첩된 참조"로 인해.
변수의 내용을 변경하거나 명령줄을 변경하면 문제가 드러납니다.
> f=foo
> set -x
> echo "reading entry: " $f ""
+ echo 'reading entry: ' foo ''
reading entry: foo
> echo "reading entry: " $f ""
+ echo 'reading entry: ' foo ''
reading entry: foo
> f="foo bar"
+ echo 'reading entry: foo' bar
reading entry: foo bar
그러한 참조가 유효하면 공백이 유지됩니다.