Bash는 명령 결과를 캡처할 때 토큰화를 수행합니까?

Bash는 명령 결과를 캡처할 때 토큰화를 수행합니까?

머리말: 관련성이 있을 수 있는 질문을 살펴보았습니다."ls"와 "echo $(ls)"의 차이점

bash는 출력 캡처 시 토큰화를 수행합니까? 이 가이드 - mywiki.wooledge.org/WordSplitting은 "아니요"라고 말합니다:

작업의 확장은 토큰화를 수행하지 않습니다. 따라서 다음과 같이 명령에 아무 것도 인용할 필요가 없습니다. [...]bar=$(a command)

그러나 출력을 수행하면 res=$(find); echo $res다음과 다릅니다 find.

$ find
.
./file2
./file1
./test.sh
$ res="$(find)"; echo $res
. ./file2 ./file1 ./test.sh
$ res=$(find); echo $res
. ./file2 ./file1 ./test.sh

 

답변1

인용한 텍스트는 변수 할당에만 관련된다는 점에 유의하세요 res. 이 부분에는 문제가 없습니다.

find표시된 대로 유틸리티는 개행으로 구분된 경로 이름을 출력으로 생성합니다 .

이 출력을 변수에 할당하면 줄 바꿈이 유지됩니다(제거되는 마지막 줄 제외).

지금까지는 괜찮았는데 그 다음에는...

echo에서 따옴표가 없는 변수를 사용하여 호출 하면 bash변수 값은 공백, 탭 및 줄 바꿈(기본적으로)으로 분할되고 결과 문자열은 파일 이름으로 생성됩니다(globbed). 결과 단어는 별도의 인수로 제공됩니다 echo.

유틸리티 echo는 공백 문자로 구분된 인수를 출력합니다(끝에 줄바꿈이 추가됨). 이것이 당신이 보여준 상황입니다 echo $res.

쉘이 변수를 단어와 파일 이름으로 분할하지 않고 변수 값을 보려면 변수의 확장을 큰따옴표로 묶 echo "$res"거나 더 좋습니다 printf '%s\n' "$res"(참조).왜 printf가 echo보다 나은가요?).

즉, 호출 시 변수 확장을 echo인용해야 합니다.

관련 정보