`tee`命令


15

tee可以将管道标准输入重定向到标准输出文件。

echo Hello, World! | tee greeting.txt

上面的命令将在终端屏幕上显示问候语,并将其保存在greeting.txt文件内容中,如果该名称中没有该问候语,则创建该文件。

还有一个-a开关,tee用于附加到现有文件而不是覆盖。


是否有一种方便的方法将管道输入重定向到命令和标准输出而不是文件?

我正在尝试创建一个包装器脚本,buku以将由其索引号指定的书签的URL复制到主选择中。

# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION

在这里,我使用echo 两次,第一次用于在终端上显示,然后保存在主选择中(剪贴板)。

我想象echo $url | teeC xsel在传递给下一个命令(链接命令)之前显示输出的某种东西或捷径,这将使我可以将整个命令链接成一行,而无需将结果保存到变量中,如下所示:

buku -f 1 -p $1 | cut -f 2 | teeC xsel    

我还可以将其urlview用于查看,选择和打开,$BROWSER如下所示:

bukuc 10-20 | urlview

3
试试tee /dev/tty还是tty0(不记得了……我在路上)
George Vasiliou

2
info tee提到过程替代,并将三通的输出输出到程序...
Xen2050

Answers:


19

在支持流程替换的 shell中很简单,例如bash

$ echo foo | tee >(xsel)
foo
$ xsel -o
foo

否则,您可以使用FIFO(尽管缺乏便利)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 

谢谢!我注意到的两件事:1. sh(Bourne shell)不支持该功能;2.箭头必须作为单个操作符的一部分粘贴以>()进行过程替换。

11

“ tee for命令”的直接模拟是pee来自moreutilstee,但带有管道)的命令。它的参数用作运行的命令,而不是路径,它们将输入通过管道传递给他们,而不是写入文件。所有命令都将通过管道传递给您pee自己的标准输入。

使用pee,可以通过告诉它同时运行xselcat输入来获得所需的结果。

echo foo | pee xsel cat

cat周围有一个额外的过程来执行输出,这对于您的用例而言并不是真正的问题,但在其他时候可能不太理想。与进程替换不同,它可以在任何外壳程序上工作,但是当然需要安装额外的(可能不那么常见)工具。

您可以通过引用以下命令来给出更复杂的命令:pee "xsel --display :1" cat。它们与一起运行sh,因此您必须注意shell元字符。


4
非常酷-不知道
钢铁起子

2
那不是一个好名字。
David Richerby
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.