쉘 명령 대체가 왜 마지막 줄 바꿈 문자를 고집합니까? # The

다음 예제와 같이 최근 질문 인 bash에서 마지막 줄 바꿈 문자는 어디로 갔습니까? , “왜”가 발생하는지 알고 싶습니다

  x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p
# Output is: 610a62 
# The trailing newline from the 'echo' command
#   has been "deleted" by Command Substitution

쉘 액션, 즉 Command Substitution이 대체하는 명령 출력에서 ​​일부 데이터를 실제로 삭제 해야하는 매우 중요한 이유 가 있다고 가정합니다 .
그러나이 것으로 생각되는 것처럼이 데이터를 둘러 볼 수는 없습니다. 이 것의 정반대 가정 .. 예를 할 수 있습니다. 명령의 출력을 스크립트 프로세스로 다시 전달하는 것 … 한 문자를 붙잡는 것이 이상하게 보이지만 그 이유는 합리적이라고 생각합니다. 그 이유가 무엇인지 알고 싶습니다 .. .



답변

쉘은 원래 완전한 프로그래밍 언어가 아니기 때문입니다.

\n일부 명령 출력에서 후행을 제거하는 것은 매우 어렵습니다 . 그러나 표시 목적으로 거의 모든 명령이로 출력을 종료 \n하므로 다른 명령에서 사용하려는 경우이를 제거하는 간단한 방법이 있어야합니다. 구성을 이용한 자동 제거가 $()선택된 솔루션이었습니다.

따라서이 질문을 답으로 받아 들일 수 있습니다.

\n다음 명령에서 후행 이 자동으로 수행되지 않은 경우 후행을 제거하는 간단한 방법을 찾을 수 있습니까 ?

> echo The current date is "$(date)", have a good day!

서식이 지정된 날짜에 나타날 수있는 이중 공백의 스매싱을 방지하려면 인용 부호가 필요합니다.


답변

그것은 표준 의 일부입니다 :

쉘 은 서브 쉘 환경에서 명령 을 실행 하고 ( 쉘 실행 환경 참조 ) 명령 대체 ( 명령 텍스트와 “$ ()”또는 역 따옴표)를 명령의 표준 출력으로 대체하여 명령 대체를 확장해야합니다. 치환 종료시 하나 이상의 <개행>의 서열.

물론 표준은 이런 방식으로 작성 되었기 때문일 수도 있지만 표준이기 때문에 ksh표준으로 기록되어 있습니다. 마음에 들지 않으면 Perl이나 다른 줄 바꿈 문자를 사용하십시오.


답변

글쎄, 나에게 이해가된다. 줄 바꿈은 처음에는 일반 명령 출력에만 있기 때문에 명령이 새 줄에서 완료된 후에 프롬프트가 나타납니다. 개행은 대부분의 경우 원래 출력의 일부가 아니므로 화면을 정리해야합니다. 명령의 출력을 구문 분석 할 때 끝에 줄 바꿈이 일반적으로 번거 롭습니다. 왜 wc명령이 두 줄의 텍스트를 출력합니까? 아, 그렇지 않다면, 그 다음에 개행 문자가 출력됩니다. 파싱 wc할 때 2 줄의 출력이 있다는 사실에 대해 걱정하고 싶지 않습니다. 실제로 한 줄이 없습니다.


답변

나는 같은 문제가 발생하여 아래 예제를 발견했다. 인용이 상황에 도움이 된 것 같습니다.

http://tldp.org/LDP/abs/html/commandsub.html .

dir_listing=`ls -l`
echo $dir_listing     # unquoted

# Expecting a nicely ordered directory listing.

# However, what you get is:
# total 3 -rw-rw-r-- 1 bozo bozo 30 May 13 17:15 1.txt -rw-rw-r-- 1 bozo
# bozo 51 May 15 20:57 t2.sh -rwxr-xr-x 1 bozo bozo 217 Mar 5 21:13 wi.sh

# The newlines disappeared.


echo "$dir_listing"   # quoted
# -rw-rw-r--    1 bozo       30 May 13 17:15 1.txt
# -rw-rw-r--    1 bozo       51 May 15 20:57 t2.sh
# -rwxr-xr-x    1 bozo      217 Mar  5 21:13 wi.sh


답변

echo "hello "따옴표없이 왜 공간을 차지합니까? IFS 문자의 값은 셸에서 구분자로 표시되므로 끝 문자 (구체적으로 구분되지 않음)가 제거됩니다. 추천 대체는 하위 쉘에서 추천을 실행하는 것이 일반적이므로 동일한 논리를 따릅니다.


답변