导出函数中子函数中的 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 所做的那样。

相关内容