머리말: 관련성이 있을 수 있는 질문을 살펴보았습니다."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
인용해야 합니다.