![bash가 명령 대체/함수 할당에서 새 줄을 제거하는 이유는 무엇입니까? [복사]](https://linux55.com/image/182410/bash%EA%B0%80%20%EB%AA%85%EB%A0%B9%20%EB%8C%80%EC%B2%B4%2F%ED%95%A8%EC%88%98%20%ED%95%A0%EB%8B%B9%EC%97%90%EC%84%9C%20%EC%83%88%20%EC%A4%84%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
다음과 같은 코드가 있다고 가정해 보겠습니다.
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