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
'programing' 카테고리의 다른 글
Azure 서비스 버스 대기열의 내용 보기 (0) | 2023.05.01 |
---|---|
Bash의 단일 따옴표와 이중 따옴표의 차이 (0) | 2023.05.01 |
mongo 명령 결과를 플랫 파일로 가져오는 방법 (0) | 2023.05.01 |
Git Pull에서 Git 오류 발생(로컬 참조를 업데이트할 수 없음) (0) | 2023.05.01 |
리눅스에서 'find-exec' 셸 함수 (0) | 2023.05.01 |