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
来获得您想要的结果。xsel
cat
echo foo | pee xsel cat
那里有一个额外的cat
进程来执行输出,这对于您的用例来说并不是真正的问题,但在其他时候可能不太理想。与进程替换不同,这适用于任何 shell,但当然它确实需要安装额外的(可能不太常见)工具。
您可以通过引用它们来给出更复杂的命令:pee "xsel --display :1" cat
。它们使用 运行sh
,因此您必须小心 shell 元字符。