tee 并分配给变量?

Put*_*nik 2 linux bash pipe tee

我需要在屏幕上看到输出,同时 grep 输出并将 grep 结果发送到变量。我认为它可以用 T 恤完成,但我不知道具体如何。我试过

mycommand | tee myvar=$(grep -c keyword)
mycommand | tee  >(myvar=$(grep -c keyword))
Run Code Online (Sandbox Code Playgroud)

但这不起作用。应该如何,最好不要写入文件?

gle*_*man 22

你会这样做:

myvar=$( mycommand | tee /dev/tty | grep -c keyword )
Run Code Online (Sandbox Code Playgroud)

使用 tee 将输出直接通过管道传输到终端,同时使用 stdout 解析输出并将其保存在变量中。


Gor*_*son 6

您可以通过一些文件描述符杂耍来做到这一点:

{ myvar=$(mycommand | tee /dev/fd/3 | grep keyword); } 3>&1
Run Code Online (Sandbox Code Playgroud)

说明:文件描述符#0用于标准输入,#1用于标准输出,#2用于标准错误;#3 通常未使用。在此命令中,将3>&1FD #1(标准输出)复制到 #3,这意味着在 中{ },有两种方法可以将输出发送到终端(或标准输出所在的任何地方)。

$( )只捕获FD#1,所以任何东西从里面将绕过它发送到#3。这正是tee /dev/fd/3其输入的作用(以及将其复制到其标准输出,即grep命令的标准输入)。

本质上,FD #3 被用来走私输出通过$( )捕获。