某些 bash 函数运行但无法导出(也没有“导出”失败)

某些 bash 函数运行但无法导出(也没有“导出”失败)

我测试了这个:

~$ test() { echo foo |sed -r s/.*(.)/\\1/g; }
~$ test
o

到目前为止,一切都很好。但是之后:

~$ export -f test
~$ bash -c ''
bash: test: line 0: syntax error near unexpected token `('
bash: test: line 0: `test () {  echo foo | sed -r s/.*(.)/\\1/g'
bash: error importing function definition for `test'

我知道使用引号可以sed解决问题。但 bash 不导出运行的函数是令人震惊的,需要解释、规则和案例。

我希望 bash 能够处理自己的引用,所以我认为这只能是一个错误。

答案1

我怀疑您的系统上有 2 个版本bash,当您调用 时bash -c '',您正在调用不同的版本。当您创建问题时,该代码或您的代码已被更改。

至于为什么我这么认为,你的代码在我的系统上不起作用:

$ test() { echo foo |sed -r s/.*(.)/\\1/g; }
bash: syntax error near unexpected token `('

问题是表达式周围没有引号sed,因此 bash 试图将其解释为 shell 表达式。我猜测这种行为在 bash 版本之间发生了变化,并且您的登录 shell 的版本bash$PATH调用bash -c ''.
您可以通过执行以下操作来检查:

$ echo $SHELL
$ which bash

 

另一个可能的原因是如果你设置了一些 shell 选项,这些选项会改变 bash 的表达式求值行为,而这些选项未被使用bash -c ''

 

至于如何解决这个问题,当我正确引用表达式时sed,它工作得很好:

$ test() { echo foo | sed 's/.*\(.\)/\1/g'; }
$ export -f test
$ bash -c 'test'
o

(注意:我必须稍微调整该sed命令,因为它对于我的版本来说不是有效的命令sed

相关内容