说我想要echo
某个东西并在变量中捕获它,同时我在屏幕上看到它。
echo "hello" | tee tmp_file
var=$(< tmp_file)
现在,我可以在终端中看到hello
,并将其保存到变量$var
中。
但是,有没有办法在不使用临时文件的情况下执行此操作? tee
似乎不是解决方案,因为它说(来自man tee
)从标准输入读取并写入标准输出和文件,而这里它是标准输出的两倍。
我在Bash 4.3中,如果这很重要。
答案 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