bash here-string이 후행 줄 바꿈을 추가하는 이유는 무엇입니까?

bash here-string이 후행 줄 바꿈을 추가하는 이유는 무엇입니까?

다음 예에서는 줄 바꿈이 추가되는 것을 보여줍니다.여기에 있는 문자열.
왜 이런 일을 하는가?

xxd -p <<<'a'  
# output: 610a

xxd -p <<<'a
'
# output: 610a0a

답변1

간단한 대답은 그것이 ksh가 작성되는 방식이기 때문입니다(그리고 bash는 호환됩니다). 하지만 이렇게 디자인을 선택한 데에는 이유가 있습니다.

대부분의 명령에는 텍스트 입력이 필요합니다. 유닉스 세계에서는텍스트 파일은 일련의 줄로 구성되며 각 줄은 개행 문자로 끝납니다.. 따라서 대부분의 경우 마지막 줄 바꿈이 필요합니다. 특히 일반적인 경우는 명령의 출력을 가져와 어떤 방식으로든 처리한 다음 명령 대체를 통해 다른 명령에 전달하는 것입니다. 명령 대체는 마지막 개행 문자를 제거하고 <<<다시 넣습니다.

tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp

Bash와 ksh는 어차피 바이너리 데이터를 다룰 수 없기 때문에(널 문자를 처리할 수 없습니다), 그들의 기능이 텍스트 데이터에 맞춰져 있다는 것은 놀라운 일이 아닙니다.

어쨌든 here-string 구문은 here-documents와 <<<마찬가지로 주로 편의를 위한 것입니다 . <<최종 개행 문자를 추가할 필요가 없다면 echo -n(bash에서) 또는 printf파이프를 사용하세요.

답변2

여기서 문자열에 개행 문자를 추가하는 실제 사례는 모드가 활성화된 read동안 명령을 사용하는 것 입니다. 스크립트가 0이 아닌 상태 코드를 생성하는 명령문을 발견하면 스크립트가 종료된다는 set -e점을 기억하십시오 . 개행 문자가 없는 문자열이 발견되면 0이 아닌 상태 코드 생성을 set -e고려하십시오 .read

#!/bin/bash
set -e

# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'

# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'

답변3

나는 이것이 여기서 문자열 끝에 개행 문자를 얻는 유일한 방법이라고 생각합니다. 증명:

xxd <<<`echo -ne "a\n"`

here-string 연산자는 귀하가 제출한 문법에 명시되어 있지 않은 한 개행 문자를 제거하는 것으로 보입니다.

관련 정보