다음 예제는 개행이 here-string에 추가됨을 보여줍니다 .
왜 이렇게됩니까?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
답변
쉬운 대답은 ksh가 그런 식으로 작성 되었기 때문에 bash는 호환됩니다. 그러나 그 디자인을 선택해야 할 이유가 있습니다.
대부분의 명령에는 텍스트 입력이 필요합니다. 유닉스 세계에서 텍스트 파일은 줄 바꿈으로 끝나는 일련의 줄로 구성됩니다 . 따라서 대부분의 경우 최종 줄 바꿈이 필요합니다. 특히 일반적인 경우는 명령 susbtitution을 사용하여 명령의 출력을 잡고 어떤 식 으로든 처리 한 다음 다른 명령으로 전달하는 것입니다. 명령 대체는 최종 개행을 제거합니다. <<<
하나를 다시 넣습니다.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash와 ksh는 어쨌든 이진 데이터를 조작 할 수 없으므로 (널 문자를 처리 할 수 없음) 해당 기능이 텍스트 데이터에 맞춰져 있다는 것은 놀라운 일이 아닙니다.
<<<
여기 문자열 구문처럼, 어쨌든 단지 편의상 대부분입니다 <<
여기-문서. 마지막 줄 바꿈을 추가하지 않으려면 echo -n
(bash에서) 또는 printf
파이프 라인을 사용하십시오.
답변
개행을 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 연산자는 제출 한 구문으로 지정되지 않은 경우 개행을 제거합니다.