说我想要echo一些东西并在变量中捕获它,同时我在屏幕上看到它.
echo "hello" | tee tmp_file
var=$(< tmp_file)
Run Code Online (Sandbox Code Playgroud)
所以现在我可以hello在终端中看到并将其保存到变量中$var.
但是,有没有办法在不使用临时文件的情况下执行此操作?tee似乎不是解决方案,因为它说(从man tee)读取标准输入并写入标准输出和文件,而这里它是标准输出的两倍.
如果这很重要,我在Bash 4.3中.
123*_*123 20
使用tee将其直接指向屏幕而不是stdout
$ var=$(echo hi | tee /dev/tty)
hi
$ echo $var
hi
Run Code Online (Sandbox Code Playgroud)
管道成功tee.
这是我在这个问题中解决的方法.
var=$(echo "hello" | tee /dev/tty)
Run Code Online (Sandbox Code Playgroud)
然后你可以$var用来取回存储的变量.
例如:
var=$(echo "hello" | tee /dev/tty); echo "$var world"
Run Code Online (Sandbox Code Playgroud)
将输出:
hello
hello world
Run Code Online (Sandbox Code Playgroud)
您可以使用管道做更多事情,例如我想在终端中打印一个短语,同时告诉它中有多少"l":
count=$(echo "hello world" | tee /dev/tty | grep -o "l" | wc -l); echo "$count"
Run Code Online (Sandbox Code Playgroud)
这将打印:
hello world
3
Run Code Online (Sandbox Code Playgroud)
将其发送到stderr。
var="$(echo "hello" | tee /dev/stderr)"
Run Code Online (Sandbox Code Playgroud)
或将标准输出复制到更高的FD并将其发送到那里。
$ exec 10>&1
$ var="$(echo "hello" | tee /proc/self/fd/10)"
hello
$ echo "$var"
hello
Run Code Online (Sandbox Code Playgroud)
伊格纳西奥回答的变体:
$ exec 9>&1
$ var=$(echo "hello" | tee >(cat - >&9))
hello
$ echo $var
hello
Run Code Online (Sandbox Code Playgroud)
详情请见:https : //stackoverflow.com/a/12451419/1054322