다음 예에서는 줄 바꿈이 추가되는 것을 보여줍니다.여기에 있는 문자열.
왜 이런 일을 하는가?
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 연산자는 귀하가 제출한 문법에 명시되어 있지 않은 한 개행 문자를 제거하는 것으로 보입니다.