较新版本的bash中导出的函数不再起作用(使用sed e标志)

时间:2014-10-21 11:28:19

标签: bash sed

我看到bash导出函数的奇怪行为带有sed替换命令的e标志。

我所拥有的旧脚本正在使用此功能将参数传递给命令内部 sed搜索/替换。然而,这似乎不再适用于较新版本的bash。

我已经在我的旧Windows机器上使用cygwin和bash 4.1.16(8)对此进行了测试并预期了行为:

$ func() { echo $1 123; } ; export -f func ; echo test | sed 's/.*/func \0/ge'
test 123

但是在使用较新版本的bash 4.3.11(1)的Linux上,这不起作用:

$ func() { echo $1 123; } ; export -f func ; echo test | sed 's/.*/func \0/ge'
sh: 1: func: not found

这两款电脑都有sed版本4.2.2。

问题是 - 我错过了什么或新版本的bash(在Shellshock之后)破坏了这个功能(导出功能)?此外,如果这被打破,那么我如何从Windows / cygwin移动我的旧脚本并仍然使它们工作? - 是的,我知道我可以通过一些改动重写它们。

2 个答案:

答案 0 :(得分:1)

解决方法:

func() { echo $1 123; } ; export -f func ; echo test | sed 's/.*/bash -c "func" \0/ge'

输出:

123

答案 1 :(得分:1)

实际上,破折号是默认 / bin / sh

是另一个问题

感谢Cyrus提示使用bash -c(实际上我认为ALWAYS直接指定哪些shell用于做你想做的工作的另一点)

与此同时,我测试了旧版本的ubuntu livecd - 问题仍然存在。所以这不是shellshock修复的错误。此外,我在做的时候看到了不同的行为:

... | sed 's/.*/sh -c "func" \0/ge'

比建议:

... | sed 's/.*/bash -c "func" \0/ge'

看起来只有破折号作为默认shell才会发生 - 去图。

所以答案是:

sudo dpkg-reconfigure dash

在这之后一切都像预期的那样。