내보낸 함수의 하위 함수에 있는 Heredoc이 실패합니다.

내보낸 함수의 하위 함수에 있는 Heredoc이 실패합니다.

이것은 작동합니다:

#!/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월에 처음 보고된 버그입니다. 다음을 참조하세요.

매우 유사한 테스트 사례가 있는 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와 마찬가지로 실제로 배치된 위치에 리디렉션을 배치하는 것으로 보입니다.

관련 정보