다음 두 명령과 그 결과를 고려하십시오.
14:57 : echo $(echo " ABC")
ABC
14:57 : echo " ABC"
ABC
zsh 버전:zsh 5.0.5 (x86_64-apple-darwin14.0)
애초에 선행 공백이 제거되는 이유는 무엇입니까? 설명서에서 설명이나 이유를 찾을 수 없습니다.
답변1
밝혀지다명령 대체IFS
명령 대체를 큰따옴표로 묶지 않는 한 from 문자를 구분 기호로 사용하여 단어로 구분합니다 . 그래서 " ABC"
하나의 요소를 포함하는 단어 목록으로 분할됩니다 "ABC"
. echo "$(echo " ABC")"
명령 대체 결과를 문자열로 사용하는 데 사용됩니다 .
일반적인 Bourne/POSIX 스타일 쉘과 달리 zsh는 명령 대체에 의해 생성된 단어를 파일 목록이 아닌 glob 패턴: echo $(echo "*")
prints 로 처리하지 않습니다( 이 옵션이 설정되지 않은 경우). 또한 일반적인 Bourne/POSIX 스타일 쉘과 달리 분할은 인용되지 않은 변수 대체에 의해 생성된 공백이 제거되지 않는 한 인용되지 않은 변수 대체가 아닌 인용되지 않은 명령 대체에서만 수행됩니다.*
glob_subst
답변2
왜냐하면 echo ABC
and 는 echo ABC
동일한 출력을 제공하고 ABC
첫 번째 명령은 echo $(echo " ABC")
==> echo ABC
==> 이기 때문입니다 ABC
. 셸은 여러 공백을 제거하기 때문에 echo
명령줄에 공백이 몇 개 있는지조차 알 수 없습니다.
다음과 같이 전체 표현식을 인용하여 공백을 보존할 수 있습니다.
$ echo "$(echo " ABC")"
ABC
또는
$ echo "$(echo ' ABC')"
ABC