为什么`echo 'hi' | tee > abc` 创建多个文件,而 `echo 'hi' > abc` 则不创建多个文件?

为什么`echo 'hi' | tee > abc` 创建多个文件,而 `echo 'hi' > abc` 则不创建多个文件?

我的环境:zsh,macOS


相关命令:

  1. echo 'hi' | tee > a b c
  2. echo 'hi' > a b c
  • 命令 1 创建名为abc内容为 的文件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将其输入复制到bc,并将标准输出复制到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到 filesbc,并复制到其标准输出(通过重定向为 file )a

你的第二个命令:

echo 'hi' > a b c

运行命令echo 'hi' b c,再次将其标准输出重定向到 file a。如果您想查看生成的文件a,您会发现它包含文本hi b c,而在第一种情况下,创建的三个文件都只包含文本hi

答案3

tee获取标准输入流并将副本发送到指定文件和标准输出。使用 ,> a您可以将标准输出流捕获到文件a,同时tee正常写入文件bc

> 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

相关内容