我的环境:zsh,macOS
相关命令:
echo 'hi' | tee > a b c
echo 'hi' > a b c
- 命令 1 创建名为
a
、b
且c
内容为 的文件hi
。 a
命令 2 创建一个名为content 的文件hi b c
。
AFAIK,仅使用命令 1没有 >
记录在以下的联机帮助页中tee
:
echo 'hi' | tee a b c
我需要一些帮助来理解为什么添加>
上述代码(即命令 1)仍然会创建多个文件,而命令 2 只创建一个文件。
答案1
重定向(>
在本例中)“使用”以下参数作为重定向的目标;其他一切都不管。所以
echo 'hi' | tee > a b c
相当于
echo 'hi' | tee b c > a
tee
将其输入复制到b
、c
,并将标准输出复制到a
。
echo 'hi' > a b c
相当于
echo 'hi' b c > a
并输出hi b c
到标准输出,该输出到a
.
答案2
这是基本的 shell 语法。重定向运算符>
仅接受一个参数,该参数用作将标准输出重定向到的文件名。其余参数将传递给命令。
所以你的第一个命令:
echo 'hi' | tee > a b c
运行命令echo 'hi' | tee b c
,将其标准输出重定向到 file a
。碰巧,tee
将其标准输入复制到作为参数给出的所有文件以及其标准输出。因此,发出的数据echo 'hi'
被复制tee
到 filesb
和c
,并复制到其标准输出(通过重定向为 file )a
。
你的第二个命令:
echo 'hi' > a b c
运行命令echo 'hi' b c
,再次将其标准输出重定向到 file a
。如果您想查看生成的文件a
,您会发现它包含文本hi b c
,而在第一种情况下,创建的三个文件都只包含文本hi
。
答案3
tee
获取标准输入流并将副本发送到指定文件和标准输出。使用 ,> a
您可以将标准输出流捕获到文件a
,同时tee
正常写入文件b
和c
。
> filename
可以出现在其一侧的任何点|
(只要间隔适当且不转义)。
为了说明这一点,这些都是同义词:
echo hi | > a tee b c
echo hi | tee > a b c
echo hi | tee b > a c
echo hi | tee b c > a