쉘 명령 대체가 후행 줄 바꿈을 먹는 이유는 무엇입니까?

쉘 명령 대체가 후행 줄 바꿈을 먹는 이유는 무엇입니까?

아래 예를 따르고,내 최근 질문 후행 줄 바꿈 문자는 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

내 생각엔 분명 좀 있을 것 같아매우쉘 조작(예: 명령 대체)의 중요한 이유는 실제로 대체 명령의 출력에서 ​​일부 데이터를 제거하는 것입니다.
하지만 이 질문은 그 반대인 것 같아서 이해할 수 없습니다.~해야 한다마..즉. 명령의 출력을 다시 스크립트 프로세스로 전달하는 중...캐릭터를 예약하는 것이 이상하게 보이지만 여기에는 타당한 이유가 있다고 생각합니다...그 이유가 무엇인지 알고 싶습니다...

답변1

쉘은 원래 완전한 프로그래밍 언어로 의도되지 않았기 때문입니다.

\n일부 명령 출력에서 ​​후행을 제거하는 것은 매우 어렵습니다. 그러나 표시 목적으로 거의 모든 명령은 출력을 로 끝내므로 \n... 다른 명령에서 사용하려는 경우 쉽게 제거할 수 있는 방법이 있어야 합니다. 건설과 함께 자동 철거가 $()선택된 솔루션이었습니다.

그렇다면 아마도 당신은 이 질문을 답으로 받아들일 것입니다.

\n다음 명령에서 이 작업이 자동으로 수행되지 않으면 후행을 제거하는 쉬운 방법을 찾을 수 있습니까?

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

이중 공백이 형식화된 날짜를 깨뜨리는 것을 방지하려면 따옴표가 필요합니다.

답변2

그것은의 일부이다기준:

쉘은 다음을 실행하여 명령 대체를 확장해야 합니다.주문하다서브셸 환경(참조:쉘 실행 환경) 및 명령 대체(텍스트)를 대체합니다.주문하다여기에 포함된 "$()" 또는 역따옴표)와 명령의 표준 출력을 추가하여 교체가 끝나면 하나 이상의 <newline> 시퀀스를 제거합니다.

물론, 표준이 그렇게 작성 ksh되었기 때문에 그렇게 작성되었을 수도 있습니다. 그러나 그것은 표준이고 문서화된 동작입니다. 마음에 들지 않으면 Perl이나 후행 개행 문자를 보존할 수 있는 다른 것을 사용하십시오.

답변3

글쎄, 그것은 나에게 이해가 된다. 개행 문자는 일반 명령 출력의 첫 번째 위치에만 나타나므로 명령이 완료된 후 프롬프트가 새 줄에 나타납니다. 대부분의 경우 개행 문자는 원시 출력의 일부가 아니며 화면을 정리하는 데 사용됩니다. 명령의 출력을 구문 분석할 때 끝에 있는 줄 바꿈은 종종 문제가 됩니다. wc명령이 2줄의 텍스트를 출력하는 이유는 무엇 입니까? 아뇨, 개행 문자가 뒤에 오는 것을 출력합니다. 구문 분석할 때 wc두 줄의 출력이 있다는 사실에 대해 걱정하고 싶지 않습니다. 출력 라인은 하나뿐입니다.

답변4

echo "hello "(따옴표 없이)이 공간을 차지하는 이유는 무엇 입니까? IFS 문자의 값은 쉘에서 구분 기호로 처리되므로 후행 문자(아무 것도 구분하지 않음)가 제거됩니다. 권장 사항 교체는 단순히 하위 셸에서 권장 사항을 수행하므로 동일한 논리를 따릅니다.

관련 정보