다음과 같은 코드가 있다고 가정해 보겠습니다.
a=$(echo -e "a\n\n\n")
echo "_${a}_"
출력은 _a_입니다. 조금 놀랐습니다. 왜 이런 일이 발생하는지 아시나요?
답변1
bash의 기반이 되는 Bourne 쉘이 40년 전에 이 작업을 시작했기 때문입니다(백틱에서 로의 구문 변경으로 이어지며 $(...)
표준에서 요구함).
zsh, ksh, yash 등을 포함하되 이에 국한되지 않는 다른 모든 유사한 쉘에도 동일하게 적용됩니다.
명확한 이유도 없습니다(사후 합리화만 가능). 하지만 다음과 같이 쉽게 해결할 수 있습니다.
a=$(some_command; echo x); a=${a%x}
백틱은 csh에서 다르게 작동합니다. 여기서 출력은 공백(또는 내부의 경우 공백과 혼합된 개행 "..."
)의 단어로 분할되고 후행 개행은 단일 공백이 됩니다.
printf 'a\n\n\n' > file
csh -c 'echo `cat file`b'
a b
역따옴표/명령 대체 기능이 있는 다른 프로그래밍 언어(예: Perl 또는 PHP)에는 이러한 단점이 없으며 명령의 정확한 출력을 캡처합니다.
perl -e 'print qx(printf "a\n\n")."b\n"'
a
b