我有这个 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/sh
shebang 来告诉它你想要使用 POSIX shell,它会告诉你要修复什么。
答案2
以下应该适用于sh
:
"$@" 2>&1 | while read line ; do echo -e "r2g: $line" ; done
请注意, sh 中 的行为echo -e
可能有所不同(例如,它实际上可能输出-e r2g: ...
。)