我需要在屏幕上查看输出,同时 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>&1
FD #1(标准输出)复制到 #3,这意味着在 中{ }
,有两种方式可以将输出发送到终端(或标准输出要去的地方)。
仅捕获$( )
FD #1,因此从其内部发送到 #3 的任何内容都将绕过它。这正是tee /dev/fd/3
其输入所做的事情(以及将其复制到其标准输出,即grep
命令的标准输入)。
本质上,FD #3 被用来偷运输出以避开$( )
捕获。
答案3
您可以像下面这样使用。如果您想使用-a
tee 附加使用选项,请记住它将创建一个带有您的变量名的文件。
$ 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