我可以在将命令输出发送到文件(一行)之前对其进行处理吗?

我可以在将命令输出发送到文件(一行)之前对其进行处理吗?

我有一个命令处理函数,它运行其参数并将结果输出到文件中。现在必须在进入文件之前处理这些命令的输出。

我只有一个要求:echo "var is: $var"必须显示将在代码中进一步使用的结果。

这违反了我的要求:"${@:1}" | perl -pe 's/\**//g' >> './test.log'

我想象这样的事情:

"${@:1}" 1>> perl -pe 's/\**//g' >> './test.log'

但它不起作用。

我已将代码简化为以下内容:

process() {
    "${@:1}" 1>>'./test.log'
}

process eval 'var=$(echo -e "*****ONE *****WORD"); echo -e "$var";'
echo "var is: $var"

目前该函数输出:

 screen :"var is: *****ONE *****WORD"

 logfile:"*****ONE *****WORD"

所需结果:

 screen :"var is: *****ONE *****WORD" 

 logfile:"ONE WORD"

我怎样才能实现这个目标?

附言。 muru 问我为什么使用 eval。我回答了,因为没有其他方法可以在不重复代码的情况下填充变量。不幸的是,我们在他的回答下的讨论被删除了。

答案1

由于您出于某种奇怪的原因在此处使用eval该变量来设置变量,因此它必须在当前 shell 中运行,而管道则不是这样。所以你可能需要进程替换:

process () {
    "${@}" > >(perl ... >> test.log)
}

例如:

$ process () {
 "${@}" > >(perl -pe 's/\**//g' >> test.log)
}
$ process eval 'var=$(echo -e "*****ONE *****WORD"); echo -e "$var";'
$ echo "var is: $var"
var is: *****ONE *****WORD
$ cat test.log
ONE WORD

相关内容