읽기를 사용하여 heredoc 문자열을 변수에 할당하려고 하는 bash 스크립트가 있는데 옵션 read
과 함께 사용하는 경우에만 작동합니다.-d ''
read -d '' <variable>
스크립트 블록
#!/usr/bin/env bash
function print_status() {
echo
echo "$1"
echo
}
read -d '' str <<- EOF
Setup nginx site-config
NOTE: if an /etc/nginx/sites-available config already exists for this
website, this routine will replace existing config with template from
this script.
EOF
print_status "$str"
내가 찾은SO에 대한 이 답변여기에서 명령을 복사하면 작동합니다. 그런데 왜 그럴까요? read
첫 번째 개행 문자를 만나면 첫 번째 호출이 중지된다는 것을 알고 있으므로 문자열에 나타나지 않는 일부 문자를 사용하면 전체 heredoc이 읽혀집니다.
read -d '|' <variable>
-- 작동합니다read -d'' <variable>
--이것은 아니다
read -d ''
나는 이것이 간단하다고 확신합니다. 그러나 이 명령 옵션에서는 무슨 일이 벌어지고 있습니까?
답변1
문제는 그것이 read -d ''
작동하지만 read -d''
작동하지 않는 이유라고 생각합니다.
이 질문은 질문과 관련이 없지만 read
"문제"를 인용합니다. ""
/ 문자열(단어)의 일부로 ''
인식되지 않습니다. 쉘이 보고/실행하는 것을 보여주도록 하십시오:
start cmd:> set -x
start cmd:> echo read -d " " foo
+ echo read -d ' ' foo
start cmd:> echo read -d" " foo
+ echo read '-d ' foo
start cmd:> echo read -d "" foo
+ echo read -d '' foo
start cmd:> echo read -d"" foo
+ echo read -d foo
답변2
귀하의 heredoc 내용은 다음과 같이 더 간단하게 작성되었습니다.
print_status(){ paste -sd\\n /dev/null - /dev/null;}
print_status <<\doc
doc body
doc
이 모든 것을 하나의 이름에 할당할 필요는 없습니다. 그 문제에 대해 더 간단한 것은 다음과 같습니다.
print_status(){ printf %s\\n '' "$@" '';}
print_status \
'line 2' \
'line 3' and lines 4,5,6
내 요점은 스크립트 파일에 많은 텍스트를 쓴 다음 쉘에 임시 파일을 읽도록 지시하는 것이 약간 많다는 것입니다.(일반적으로 여기 문서가 작동하는 방식입니다)그리고 일부 명령의 stdin에서 해당 임시 파일을 엽니다(대상 명령이 해당 파일을 다시 변수로 읽는 경우)! 바라보다? 제 생각에는 이것은 약간 중복됩니다.