这有效:
#!/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 所做的那样。