bash here-string이 왜 줄 바꿈 문자를 추가합니까?


34

다음 예제는 개행이 here-string에 추가됨을 보여줍니다 .
왜 이렇게됩니까?

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

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

답변:


38

쉬운 대답은 ksh가 그런 식으로 작성 되었기 때문에 bash는 호환됩니다. 그러나 그 디자인을 선택해야 할 이유가 있습니다.

대부분의 명령에는 텍스트 입력이 필요합니다. 유닉스 세계에서 텍스트 파일은 줄 바꿈으로 끝나는 일련의 줄로 구성됩니다 . 따라서 대부분의 경우 최종 줄 바꿈이 필요합니다. 특히 일반적인 경우는 명령 susbtitution을 사용하여 명령의 출력을 잡고 어떤 식 으로든 처리 한 다음 다른 명령으로 전달하는 것입니다. 명령 대체는 최종 개행을 제거합니다. <<<하나를 다시 넣습니다.

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

Bash와 ksh는 어쨌든 이진 데이터를 조작 할 수 없으므로 (널 문자를 처리 할 수 ​​없음) 해당 기능이 텍스트 데이터에 맞춰져 있다는 것은 놀라운 일이 아닙니다.

<<<여기 문자열 구문처럼, 어쨌든 단지 편의상 대부분입니다 <<여기-문서. 마지막 줄 바꿈을 추가하지 않으려면 echo -n(bash에서) 또는 printf파이프 라인을 사용하십시오.


내 대답보다 훨씬 더 철저합니다.
Mike

2
Bash는 ksh93에서 here-strings를 빌려 왔지만 ksh는 zsh에서 빌려 왔으며, 이는 Plan 9 shell rc 에서 가져 왔습니다 .
Mark Reed

2
<<<에 의해 보른 세계에 도입 zsh하지 ksh. 그리고 그것은 유닉스 포트에있는 비슷한 연산자에서 영감을 얻었 rc으며 그 줄 바꿈 문자를 추가 하지 않았습니다 . 흥미롭게도 =(<<<text)연산자는에 개행을 추가하지 않습니다 zsh.
Stéphane Chazelas

이 답변에 대한 관심이 궁금하다면 SO 의이 질문 때문입니다 .
fedorqui

1
printftailing 줄 바꿈을 피하면서 here-string을 작성하는 방법이 있습니까 (예 : 등의 다른 유틸리티를 사용하지 않고 ) bash? @ StéphaneChazelas와 마찬가지로에서 가능합니다 zsh.
CTodea

3

개행을 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'

-3

나는 이것이 here-string의 끝에 줄 바꿈을 얻는 유일한 방법이라고 생각합니다.

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

here-string 연산자는 제출 한 구문으로 지정되지 않은 경우 개행을 제거합니다.


4
마지막 줄 바꿈을 제거하는 것은 명령 대체입니다. 이 작업을 단순화 할 수 xxd <<<$(echo a)있습니다.
Gilles 'SO- 악의를 그만두십시오'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.