从...开始
请记住,我的命令(例如示例中的tee)会将输出内容发送到标准输出,而我希望将其丢弃。
... 我认为你告诉我们,在你最感兴趣的情况下,示例命令中的tee是某个其他程序的替代品。
我还注意到你说你有一个写入文件的命令。虽然tee确实是这样一个命令,但你提供的命令行中存在一个拼写错误。在tee命令行上给出的文件名被用作输出文件,而<(var=$(cat))则是用于读取的。我猜你的意思更像是这样的示例:
echo test | my_program >(var=$(cat)) >/dev/null && echo "var = $var"
尽管如此,当然还是不起作用。
底线是:你想将命令的输出捕获到一个文件中,而不是标准输出,而且不引入临时文件。
看起来你正在使用大多数正确的工具来完成这个任务,但是没有将它们以正确的方式组合起来。如果你想避免使用临时文件,那么我认为没有其他办法,只能在顶层执行命令替换:
var=$(...) && echo "var = ${var}"
原来这个
>(cat)
是一个伪文件,它会将所有写入它的内容发送到
cat
的标准输出。将所有这些组合在一起,你就得到了这个:
var=$(echo test | my_program >(cat) >/dev/null) && echo "var = ${var}"
请注意,在该命令中,
my_program
的标准输出重定向与
cat
无关。
cat
命令继承自由命令替换引入的子shell环境的标准输出,这正是命令替换所捕获的内容。
还要注意,管道必须位于命令替换内部,以使变量赋值处于“顶级”位置,如上所述。也就是说,您不能这样做...
# DOES NOT WORK
echo test | { var=$(my_program >(cat) >/dev/null); } && echo "var = ${var}"
因为管道为每个组件命令引入了一个子shell环境,就像命令替换对其命令所做的那样。
echo test | tee >(var=$(cat) ; printf 'var = %s\n' "$var")
- Jetchiselecho test | tee >(var=$(cat) ; printf 'var = %s\n' "$var")
- Jetchiselecho test | tee >(var=$(cat) ; printf 'var = %s\n' "$var")
- undefined