zsh 함수 출력에서 ​​선행 공백이 제거됩니다.

zsh 함수 출력에서 ​​선행 공백이 제거됩니다.

다음 두 명령과 그 결과를 고려하십시오.

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 ABCand 는 echo ABC동일한 출력을 제공하고 ABC첫 번째 명령은 echo $(echo " ABC")==> echo ABC==> 이기 때문입니다 ABC. 셸은 여러 공백을 제거하기 때문에 echo명령줄에 공백이 몇 개 있는지조차 알 수 없습니다.

다음과 같이 전체 표현식을 인용하여 공백을 보존할 수 있습니다.

$ echo "$(echo "  ABC")"
    ABC

또는

$ echo "$(echo '  ABC')"
    ABC

관련 정보