programing

here-discovery는 '예상치 못한 파일 종료' 오류를 제공합니다.

muds 2023. 5. 1. 22:04
반응형

here-discovery는 '예상치 못한 파일 종료' 오류를 제공합니다.

터미널에서 이메일을 보내려면 제 대본이 필요합니다.여기와 다른 많은 온라인 장소에서 본 내용을 바탕으로 다음과 같이 포맷했습니다.

/var/mail -s "$SUBJECT" "$EMAIL" << EOF
Here's a line of my message!
And here's another line!
Last line of the message here!
EOF

그러나 이를 실행하면 다음과 같은 경고가 표시됩니다.

myfile.sh: line x: warning: here-document at line y delimited by end-of-file (wanted 'EOF')

myfile.sh: line x+1: syntax error: unexpected end of file

...여기서 line x는 프로그램에서 마지막으로 작성된 코드 라인이고 line y는 다음과 같은 코드 라인입니다./var/mail그 안에 있어요. 제가 대신해봤어요.EOF다른 것들과 함께 (ENDOFMESSAGE,FINISH등) 하지만 소용이 없습니다.제가 온라인에서 찾은 거의 모든 것들이 이런 식으로 이루어졌고, 저는 배시를 정말 처음이라 혼자서 해결하는 데 어려움을 겪고 있습니다.누가 도움을 줄 수 있습니까?

EOF토큰은 줄의 시작 부분에 있어야 합니다. 토큰이 사용되는 코드 블록과 함께 들여쓸 수 없습니다.

당신이 쓴다면,<<-EOF들여쓰기는 할 수 있지만 공백이 아닌 문자로 들여쓰기해야 합니다.그래서 코드 블록으로도 끝나지 않을 수도 있습니다.

또한 다음 이후에 공백이 없는지 확인합니다.EOF토큰이 걸려 있습니다.

여기서 문서를 시작하거나 종료하는 줄에는 인쇄할 수 없거나 공백 문자(예: 캐리지 리턴)가 있을 수 있습니다. 이는 두 번째 "EOF"가 첫 번째 "EOF"와 일치하지 않으며 여기서 문서를 원래대로 종료하지 않는다는 것을 의미합니다.이는 매우 일반적인 오류이며 텍스트 편집기만으로는 탐지하기 어렵습니다.예를 들어 인쇄할 수 없는 문자를 표시할 수 있습니다.cat:

cat -A myfile.sh

의 출력을 확인하면cat -A해결책은 분명할 것입니다. 문제가 되는 문자를 제거하십시오.

앞에 있는 공백을 제거해 보십시오.EOF:-

/var/mail -s "$SUBJECT" "$EMAIL" <<-EOF

사용.<tab>대신에<spaces>ID를 위해 그리고 <<-EOF>를 사용하는 것은 잘 작동합니다.

"-"를 제거합니다.<tabs>,것은 아니다.<spaces>하지만 적어도 이것은 효과가 있습니다.

이 작업을 수행하면 이 오류가 발생할 수도 마찬가지입니다.

while read line; do
  echo $line
done << somefile

왜냐면<< somefile읽어야 합니다< somefile이 경우에는

"배시 경고: 파일 끝으로 구분된 여기 문서"를 검색한 여기서 비틀거리는 사람은 다음과 같은 정보를 얻을 수 있습니다.

경고: 파일 끝으로 구분된 74행에 다시 표시

...여기 문자열 <<<기호()를 사용하려고 때 실수로 여기 문서 기호()<<를 사용했으므로 경고를 입력합니다.그건 제 경우였어요.

bash 함수에 대한 docstring을 원할 때 이 질문의 중복에서 user12205의 제안과 유사한 솔루션을 사용합니다.

다음과 같은 솔루션에 대한 사용을 정의하는 방법을 확인하십시오.

  • 내가 선택한 IDE에서 나에게 적합한 자동 포맷(고급)
  • 다중 행입니다.
  • 공백 또는 탭을 들여쓰기로 사용할 수 있습니다.
  • 주석 내 들여쓰기를 보존합니다.
function foo {
    # Docstring
    read -r -d '' USAGE <<'    END'
        # This method prints foo to the terminal.
        #
        # Enter `foo -h` to see the docstring.
        #      It has indentations and multiple lines.
        #
        # Change the delimiter if you need hashtag for some reason.
        # This can include $$ and = and eval, but won't be evaluated
    END


    if [ "$1" = "-h" ]
    then
        echo "$USAGE" | cut -d "#" -f 2 | cut -c 2-
        return
    fi

    echo "foo"
}

그렇게foo -h산출량:

This method prints foo to the terminal.

Enter `foo -h` to see the docstring.
     It has indentations and multiple lines.

Change the delimiter if you need hashtag for some reason.
This can include $$ and = and eval, but won't be evaluated

설명.

cut -d "#" -f 2의 두 번째 부분을 검색합니다.#구분선("#"이 있는 csv를 구분 기호로 생각하고 첫 번째 열을 비웁니다.)

cut -c 2-의 두 .

또참고는 다음과 .if [ "$1" = "-h" ]으로 됩니다.False첫 번째 인수가 없으면 빈 문자열이 되므로 오류가 없습니다.

나이가 많았을 수도 있지만 엔딩 EOF << EOF blah blah OF <-- 이것이 이슈였습니다.몇 년 동안 가지고 있다가 마침내 여기서 찾아봤습니다.

hereoc를 사용하지 않고 여러 들여쓰기된 을 유연하게 처리할 수 있는 방법이 있습니다.

  echo 'Hello!'
  sed -e 's:^\s*::' < <(echo '
    Some indented text here.
    Some indented text here.
  ')
  if [[ true ]]; then
    sed -e 's:^\s\{4,4\}::' < <(echo '
      Some indented text here.
        Some extra indented text here.
      Some indented text here.
    ')
  fi

이 솔루션에 대한 몇 가지 참고 사항:

  • 내용에 단순 따옴표가 있을 것으로 예상되는 경우, 다음을 사용하여 해당 따옴표를 이스케이프합니다.\또는 문자열 구분 기호를 큰따옴표로 바꿉니다.후자의 경우, 다음과 같은 구조를 주의하십시오.$(command)해석될 것입니다.문자열에 단순 따옴표와 큰따옴표가 모두 포함된 경우 적어도 일종의 이스케이프를 수행해야 합니다.
  • 주어진 예는 뒤에 이어지는 빈 줄을 인쇄합니다. 제안을 최소한으로 유지하기 위해 여기에 포함되지 않은, 그것을 제거하는 수많은 방법이 있습니다.
  • SED REGEXP를 알고 있다면 얼마나 많은 선두 공간을 유지하거나 이동해야 하는지를 제어할 수 있는 편리함에서 유연성을 얻을 수 있습니다.

답변들과 , 와 조니를 사용할 때 때때로 에 빈 <<-EOF.

언급URL : https://stackoverflow.com/questions/18660798/here-document-gives-unexpected-end-of-file-error

반응형