답변:
쉬운 대답은 ksh가 그런 식으로 작성 되었기 때문에 bash는 호환됩니다. 그러나 그 디자인을 선택해야 할 이유가 있습니다.
대부분의 명령에는 텍스트 입력이 필요합니다. 유닉스 세계에서 텍스트 파일은 줄 바꿈으로 끝나는 일련의 줄로 구성됩니다 . 따라서 대부분의 경우 최종 줄 바꿈이 필요합니다. 특히 일반적인 경우는 명령 susbtitution을 사용하여 명령의 출력을 잡고 어떤 식 으로든 처리 한 다음 다른 명령으로 전달하는 것입니다. 명령 대체는 최종 개행을 제거합니다. <<<
하나를 다시 넣습니다.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash와 ksh는 어쨌든 이진 데이터를 조작 할 수 없으므로 (널 문자를 처리 할 수 없음) 해당 기능이 텍스트 데이터에 맞춰져 있다는 것은 놀라운 일이 아닙니다.
<<<
여기 문자열 구문처럼, 어쨌든 단지 편의상 대부분입니다 <<
여기-문서. 마지막 줄 바꿈을 추가하지 않으려면 echo -n
(bash에서) 또는 printf
파이프 라인을 사용하십시오.
<<<
에 의해 보른 세계에 도입 zsh
하지 ksh
. 그리고 그것은 유닉스 포트에있는 비슷한 연산자에서 영감을 얻었 rc
으며 그 줄 바꿈 문자를 추가 하지 않았습니다 . 흥미롭게도 =(<<<text)
연산자는에 개행을 추가하지 않습니다 zsh
.
printf
tailing 줄 바꿈을 피하면서 here-string을 작성하는 방법이 있습니까 (예 : 등의 다른 유틸리티를 사용하지 않고 ) bash
? @ StéphaneChazelas와 마찬가지로에서 가능합니다 zsh
.
개행을 here-strings에 추가하는 것이 실용적인 시나리오는 mode가 활성화되어 read
있을 때 명령을 사용할 때 set -e
입니다. 리콜 set -e
이 (다소) 비 제로 상태 코드를 생성 문을 발견 한 경우 스크립트의 원인은 종료합니다. read
줄 바꿈이없는 문자열을 발견하면 0이 아닌 상태 코드 를 생성하는 것을 고려하십시오 .
#!/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'
나는 이것이 here-string의 끝에 줄 바꿈을 얻는 유일한 방법이라고 생각합니다.
xxd <<<`echo -ne "a\n"`
here-string 연산자는 제출 한 구문으로 지정되지 않은 경우 개행을 제거합니다.
xxd <<<$(echo a)
있습니다.