여기서 문자열 명령 대체가 왜 한 줄로 처리됩니까?

여기서 문자열 명령 대체가 왜 한 줄로 처리됩니까?

나는 노력하고있다while read통사론내가 이해하지 못하는 것이 있습니다.

문제를 재현하는 가장 기본적인 시나리오는 다음과 같습니다. bash 스크립트는 a.sh다른 스크립트를 호출 b.sh하고 해당 스크립트가 에코하는 줄을 표시합니다.

a.sh

#!/bin/bash

while read line; do
    echo "<<$line>>"
done <<< `./b.sh`

b.sh

#!/bin/bash

echo "Hello"
echo "World"

실행하면 b.sh예상되는 결과가 나타납니다.

Hello
World

반면에 을 실행하면 a.sh출력은 다음과 같습니다.

<<Hello World>>

나는 그것이 다음과 같을 것으로 예상했지만

<<Hello>>
<<World>>

내가 뭘 잘못했나요?

답변1

~에서4.4-알파와 4.4-베타 사이의 Bash 변경 로그:

[...]

이 문서에서는 bash-4.4-beta 버전과 bash-4.4-alpha 이전 버전 간의 변경 사항을 자세히 설명합니다.

[...]

지. 문서에서 계속해서 말하듯이 Bash는 더 이상 여기에서 문자열 확장을 분할하지 않습니다.

이것은 나에게 다소 모호하지만 bash당시 소스 코드에 어떤 변경이 이루어졌든 다음과 같은 영향을 미쳤을 것입니다. Bash 4.4에서 다음 명령은 다음과 같습니다.

while read line; do
    printf '<<%s>>\n' "$line"
done <<< $( printf '%s\n' hello world )

생산할 것이다

<<hello>>
<<world>>

아니요

<<hello world>>

Bash 4.3에서 볼 수 있듯이.

관련 정보