我测试了这个:
~$ 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
)