如何创建 sh 兼容的 bash 函数

如何创建 sh 兼容的 bash 函数

我有这个 bash 函数:

zmx(){
 "$@"  \
      2> >( while read line; do echo -e "r2g: $line"; done ) \
      1> >( while read line; do echo -e "r2g: $line"; done )
}

这个函数应该只由 bash 获取和运行,但出于某种天赐的原因,它是由 sh 获取/运行的。

您可以像这样使用上面的函数:

zmx foo bar

它将添加r2g:到 foo 命令的 stdout/stderr 之前。

所以我的问题是——有谁知道如何将上面的 bash 函数翻译成 sh 可以使用的东西吗?

现在,当 sh 解释该函数时,我遇到语法错误。几个月来我一直在努力弄清楚为什么调用 sh 来解释该函数,但我几乎放弃了阻止 sh 这样做的尝试。

答案1

这是另一种适用于 POSIX 的方法sh

zmx() {
    "$@" 2>&1 | sed 's/^/r2g: /'
}

这避免了处理read的微妙之处。

要自己检查此类 shell 片段,您可以使用外壳检查:添加一个#!/bin/shshebang 来告诉它你想要使用 POSIX shell,它会告诉你要修复什么。

答案2

以下应该适用于sh

"$@" 2>&1 | while read line ; do echo -e "r2g: $line" ; done

请注意, sh 中 的行为echo -e可能有所不同(例如,它实际上可能输出-e r2g: ...。)

相关内容