Bash 읽기를 위한 -d 옵션은 어떻게 작동합니까?

Bash 읽기를 위한 -d 옵션은 어떻게 작동합니까?

읽기를 사용하여 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에서 해당 임시 파일을 엽니다(대상 명령이 해당 파일을 다시 변수로 읽는 경우)! 바라보다? 제 생각에는 이것은 약간 중복됩니다.

관련 정보