简单的T恤示例

时间:2015-06-10 19:37:20

标签: linux shell tee

有人可以解释为什么开球在这里工作:

echo "testtext" | tee file1 > file2

我的理解是,tee复制输入并将1打印到屏幕。

上面的例子允许echo的输出发送到2个文件,第一个重定向到第二个文件。

我希望'testtext'打印到屏幕并通过file1并登陆file2。类似于以下示例中的文本仅以文件2结尾。

echo "testtext" > file1 > file2

任何人都可以解释我理解中缺少的东西吗?

修改

是因为它写入文件然后写入重定向的stdout吗?

3 个答案:

答案 0 :(得分:4)

您的描述是正确的:tee从stdin接收数据并将其写入文件和标准输出。但是当你将tee的stdout重定向到另一个文件时,显然没有任何内容写入终端,因为数据最终都在第二个文件中。

  

是因为它写入文件然后写入重定向的stdout吗?

完全。

你想做的事情可以这样做(展示三通如何运作):

$ echo "testtext" | tee file1 | tee file2
testtext

但是,由于来自gnu coreutils的tee接受了几个输出文件的指定,所以可以做到:

$ echo "testtext" | tee file1 file2
testtext

但您对通过file1并登陆file2 的想法是不正确的。你的shell示例:

echo "testtext" > file1 > file2

使shell打开文件file1file2进行写入有效地截断它们,因为stdout只能直接重定向到另一个文件,只有最后一次重定向是有效的(因为它覆盖了前一个)那些)。

答案 1 :(得分:3)

tee将其输入写入其参数中指定的每个文件(可能需要多个)以及标准输出。这个例子也可以写成

echo "testtext" | tee file1 file2 > /dev/null

您明确写入这两个文件,然后忽略标准输出的内容,而不是将标准输出重定向到其中一个文件。

您展示的命令中的> file2并未以某种方式提取"提取"写入file1的内容,将标准输出写入屏幕。相反,> file2指示shell将file2(而不是终端)上打开的文件句柄传递给tee,以便将其用作标准输出。

答案 2 :(得分:1)

"是因为它写入文件然后写入重定向的stdout?" 这是正确的

tee将输出发送到指定文件和stdout。 最后一个">"将standout重定向到指定的第二个文件。