我测试了这个:
~$ 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 能够处理自己的引用,所以我认为它只能是一个错误。
我怀疑您
bash
的系统上有 2 个版本,当您调用 时bash -c ''
,您正在调用不同的版本。当您创建问题时,该代码或您的代码已更改。至于我为什么这么认为,你的代码在我的系统上不起作用:
问题是表达式周围没有引号
sed
,因此 bash 试图将其解释为 shell 表达式。我猜这种行为在 bash 版本之间发生了变化,并且您的登录 shellbash
与$PATH
调用bash -c ''
.您可以通过执行以下操作来检查:
另一个可能的原因是,如果您设置了一些 shell 选项,这些选项正在改变 bash 表达式求值的行为,而这些选项没有被
bash -c ''
.至于如何解决这个问题,当我正确引用
sed
表达式时,它工作正常:(注意:我不得不稍微调整
sed
命令,因为它不是我的版本的有效命令sed
)