bash: 이 두 스크립트 변형의 차이점은 무엇인가요?

bash: 이 두 스크립트 변형의 차이점은 무엇인가요?

(참고: 이 두 가지 예는가능한GNU 또는 BSD가 필요하며 findPOSIX "버전"에서는 있는 그대로 작동하지 않을 수 있습니다 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

그러한 참조가 유효하면 공백이 유지됩니다.

관련 정보