【发布时间】:2014-12-16 14:41:26
【问题描述】:
我看到带有 sed 替换命令的 e 标志的 bash 导出函数的奇怪行为。
我拥有的旧脚本正在使用此功能将参数传递给内部命令 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 中移动我的旧脚本并让它们仍然工作? - 是的,我知道我可以通过一些更改来重写它们。
【问题讨论】:
-
/bin/shbash 在你的 Linux 机器上吗? -
这更像是一个引号/双引号问题而不是导出问题。 Sed 在您的单引号操作列表中随意使用它。这在 win/cygwin bash 中比在 linux 中更像是一个错误(或由于 Windows 限制而导致的有限实现)。
-
@NeronLeVelu:这里没有引用问题。注意 sed 表达式中的
/e(我认为是 GNU)“修饰符”。 -
@mat:你说得对,我忘记了我从未在 AIX 上使用过的
/e。对不起