이것은 작동합니다:
#!/bin/bash
foo() {
gen() {
cat <<EOF
bar
EOF
true
}
gen
}
foo
export -f foo
bash -c foo
마지막 줄에서 실패합니다.
#!/bin/bash
foo() {
gen() {
cat <<EOF
bar
EOF
}
gen
}
foo
export -f foo
bash -c foo
주다:
bar
bash: foo: line 9: syntax error: unexpected end of file
bash: error importing function definition for `foo'
bash: foo: command not found
true
마지막 것이 왜 필요한가요?
$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
답변1
이는 2019년 7월에 처음 보고된 버그입니다. 다음을 참조하세요.
- https://lists.gnu.org/archive/html/bug-bash/2019-06/msg00063.html
- https://lists.gnu.org/archive/html/bug-bash/2019-07/msg00002.html
- https://lists.gnu.org/archive/html/bug-bash/2020-03/msg00014.html
매우 유사한 테스트 사례가 있는 SO에 대한 질문도 있습니다(위의 마지막 이메일 링크).Bash에서 중첩된 함수 정의 및 구분 기호를 사용하여 함수 내보내기
CHANGES 파일에는 bash-5.0-release와 bash-5.1-alpha 사이의 내용이 나열되어 있습니다.
ll. Fixed a bug with printing function definitions containing here documents.
내가 테스트할 수 있는 한, 귀하의 테스트 케이스는 Bash 4.4 및 현재 git 버전에서 작동합니다.
declare -p -f foo
여기서 제가 궁금한 점은 함수가 정의된 것을 살펴보면 here-doc가 gen
존재했다면 발생하지 않았을 외부에 쳐박아 놓은 것을 볼 수 있다는 것입니다. true
거기 뭔가 엉망이 된 것 같습니다. 이것은 작업 버전입니다:
$ declare -p -f foo
foo ()
{
function gen ()
{
cat
} <<EOF
bar
EOF
gen
}
이것은 깨졌습니다 :
$ declare -p -f foo
foo ()
{
function gen ()
{
cat <<EOF
}
bar
EOF
gen
}
<< EOF
리디렉션이 잘못된 위치에 있습니다 . 폐막식 }
. git 버전은 Ksh 및 Zsh와 마찬가지로 실제로 배치된 위치에 리디렉션을 배치하는 것으로 보입니다.