假设我想要在屏幕上输出一些内容并将其保存到一个变量中,同时我也想在屏幕上看到它。
echo "hello" | tee tmp_file
var=$(< tmp_file)
现在我可以在终端中看到hello
,并将其保存到变量$var
中。
但是,有没有不使用临时文件的方法来实现这一点?tee
似乎不是解决方案,因为它说(来自man tee
)从标准输入读取并写入标准输出和文件,而这里是两次标准输出。
我在Bash 4.3中,如果这很重要。
使用 tee
命令将内容直接输出到屏幕而不是标准输出流(stdout)
$ var=$(echo hi | tee /dev/tty)
hi
$ echo $var
hi
管道命令 tee
就是关键。
这是我在这个问题中讨论的方法。
var=$(echo "hello" | tee /dev/tty)
< p >那么您可以使用< code > $var 来获取存储的变量。
< p >例如:var=$(echo "hello" | tee /dev/tty); echo "$var world"
将输出:
hello
hello world
您可以通过管道做更多的事情,例如我想在终端中打印一个短语,并同时告诉它中有多少个“l”:
count=$(echo "hello world" | tee /dev/tty | grep -o "l" | wc -l); echo "$count"
这会打印出:
hello world
3
$ exec 9>&1
$ var=$(echo "hello" | tee >(cat - >&9))
hello
$ echo $var
hello
exec 10>&1
在zsh上失败(并关闭shell,因为它将10
解释为用来替换shell的命令(然后失败,因为10
不是有效的命令),但将10替换为9,一切都正常 :):exec 9>&1
。 - Claudevar="$(echo "hello" | tee /dev/stderr)"
或者将stdout复制到更高的FD并将其发送到那里。
$ exec 10>&1
$ var="$(echo "hello" | tee /proc/self/fd/10)"
hello
$ echo "$var"
hello
exec
有两个作用。第一个是用新进程替换当前进程。第二个是使用重定向语法操作文件描述符。如果没有指定命令,则FD重定向将应用于当前进程。 - Ignacio Vazquez-Abrams&1
指向 /proc/self/fd/1
,该文件指向 /dev/pts/1
,即终端屏幕。这意味着 /proc/self/fd/10
指向与 /proc/self/fd/1
相同的文件,即终端屏幕。这意味着当使用 tee 命令时,它会直接输出到终端,而 stdout(&1) 则被赋值所捕获。这是一种迂回的方式,只是为了将输出重定向到 /dev/pts/1
。 - 123
stdout
时,不应该写入/dev/tty
。/dev/tty
可能根本不存在。 - xhienne