tee 并分配给变量?

tee 并分配给变量?

我需要在屏幕上查看输出,同时 grep 输出并将 grep 结果发送到变量。我认为可以用 tee 完成,但我不知道具体怎么做。我试过了

mycommand | tee myvar=$(grep -c keyword)
mycommand | tee  >(myvar=$(grep -c keyword))

但这不起作用。应该怎么做呢?最好不要写入文件?

答案1

你可以这样做:

myvar=$( mycommand | tee /dev/tty | grep -c keyword )

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

答案2

您可以通过一些文件描述符操作来实现这一点:

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

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

仅捕获$( )FD #1,因此从其内部发送到 #3 的任何内容都将绕过它。这正是tee /dev/fd/3其输入所做的事情(以及将其复制到其标准输出,即grep命令的标准输入)。

本质上,FD #3 被用来偷运输出以避开$( )捕获。

答案3

您可以像下面这样使用。如果您想使用-atee 附加使用选项,请记住它将创建一个带有您的变量名的文件。

$ ls | tee $(echo asktyagi)
asktyagi1

$ ls -lthr
total 12K
-rw-rw-r--. 1 asktyagi asktyagi    8 Oct 29 08:54 asktyagi1
-rw-rw-r--. 1 asktyagi asktyagi   23 Oct 29 08:54 asktyagi

相关内容