【问题标题】:Exported functions in newer version of bash does not work anymore (with sed e flag)新版本 bash 中的导出函数不再起作用(使用 sed e 标志)
【发布时间】: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/sh bash 在你的 Linux 机器上吗?
  • 这更像是一个引号/双引号问题而不是导出问题。 Sed 在您的单引号操作列表中随意使用它。这在 win/cygwin bash 中比在 linux 中更像是一个错误(或由于 Windows 限制而导致的有限实现)。
  • @NeronLeVelu:这里没有引用问题。注意 sed 表达式中的 /e(我认为是 GNU)“修饰符”。
  • @mat:你说得对,我忘记了我从未在 AIX 上使用过的 /e。对不起

标签: bash sed


【解决方案1】:

解决方法:

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

输出:

123

【讨论】:

  • 感谢您的提示。为了让这种脚本具有更好的可移植性 - 直接指出使用 bash 比使用默认 shell 肯定比依赖未知的系统设置更好。
【解决方案2】:

实际上 dash 是默认的 /bin/sh

是另一个问题

感谢 Cyrus 对 bash -c 的提示(实际上,我认为这是始终直接指定使用哪个 shell 来完成您想要真正完成的工作的另一点)

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

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

比建议的:

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

而且看起来这只发生在 dash 作为默认 shell 的情况下 - 看图。

所以答案是:

sudo dpkg-reconfigure dash

在此之后,一切都按预期进行。

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 2011-09-04
    • 1970-01-01
    • 2021-11-05
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多