有人可以解释为什么开球在这里工作:
echo "testtext" | tee file1 > file2
我的理解是,tee复制输入并将1打印到屏幕。
上面的例子允许echo的输出发送到2个文件,第一个重定向到第二个文件。
我希望'testtext'打印到屏幕并通过file1并登陆file2。类似于以下示例中的文本仅以文件2结尾。
echo "testtext" > file1 > file2
任何人都可以解释我理解中缺少的东西吗?
修改
是因为它写入文件然后写入重定向的stdout吗?
答案 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打开文件file1
和file2
进行写入有效地截断它们,因为stdout只能直接重定向到另一个文件,只有最后一次重定向是有效的(因为它覆盖了前一个)那些)。
答案 1 :(得分:3)
tee
将其输入写入其参数中指定的每个文件(可能需要多个)以及标准输出。这个例子也可以写成
echo "testtext" | tee file1 file2 > /dev/null
您明确写入这两个文件,然后忽略标准输出的内容,而不是将标准输出重定向到其中一个文件。
您展示的命令中的> file2
并未以某种方式提取"提取"写入file1
的内容,将标准输出写入屏幕。相反,> file2
指示shell将file2
(而不是终端)上打开的文件句柄传递给tee
,以便将其用作标准输出。
答案 2 :(得分:1)
"是因为它写入文件然后写入重定向的stdout?" 这是正确的
tee将输出发送到指定文件和stdout。 最后一个">"将standout重定向到指定的第二个文件。