如何在打印输出的同时将命令输出存储在变量中?

时间:2016-05-06 08:38:19

标签: bash stdout gnu

说我想要echo某个东西并在变量中捕获它,同时我在屏幕上看到它。

echo "hello" | tee tmp_file
var=$(< tmp_file)

现在,我可以在终端中看到hello,并将其保存到变量$var中。

但是,有没有办法在不使用临时文件的情况下执行此操作? tee似乎不是解决方案,因为它说(来自man tee从标准输入读取并写入标准输出和文件,而这里它是标准输出的两倍。

我在Bash 4.3中,如果这很重要。

4 个答案:

答案 0 :(得分:16)

使用tee将其直接指向屏幕而不是stdout

$ var=$(echo hi | tee /dev/tty)
hi
$ echo $var
hi

答案 1 :(得分:6)

管道tee可以解决问题。

这是我在this question中解决的方法。

var=$(echo "hello" | tee /dev/tty)

然后您可以使用$var取回存储的变量。

例如:

var=$(echo "hello" | tee /dev/tty); echo "$var world"

将输出:

hello
hello world

您可以使用管道做更多事情,例如我想在终端中打印一个短语,同时告诉其中有多少&#34; l&#34; s:

count=$(echo "hello world" | tee /dev/tty | grep -o "l" | wc -l); echo "$count"

这将打印:

hello world
3

答案 2 :(得分:5)

发送给stderr。

var="$(echo "hello" | tee /dev/stderr)"

或者将stdout复制到更高的FD并将其发送到那里。

$ exec 10>&1
$ var="$(echo "hello" | tee /proc/self/fd/10)"
hello
$ echo "$var"
hello

答案 3 :(得分:2)

Ignacio答案的变体:

$ exec 9>&1                                                                                                              
$ var=$(echo "hello" | tee >(cat - >&9))   
hello                                                                              
$ echo $var
hello

详细信息:https://stackoverflow.com/a/12451419/1054322