我看到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移动我的旧脚本并仍然使它们工作? - 是的,我知道我可以通过一些改动重写它们。
答案 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
在这之后一切都像预期的那样。