命令的“tee”

命令的“tee”

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

答案1

在支持的 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
$ 

答案2

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

使用,您可以通过告诉它运行和并输入输入pee来获得您想要的结果。xselcat

echo foo | pee xsel cat

那里有一个额外的cat进程来执行输出,这对于您的用例来说并不是真正的问题,但在其他时候可能不太理想。与进程替换不同,这适用于任何 shell,但当然它确实需要安装额外的(可能不太常见)工具。

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

相关内容