我有一个命令处理函数,它运行其参数并将结果输出到文件中。现在必须在进入文件之前处理这些命令的输出。
我只有一个要求: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