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

cat*_*ith 19 zsh io-redirection tee

我的环境: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,只有 Command 1 的用法没有 >记录在联机帮助页中tee

echo 'hi' | tee a b c
Run Code Online (Sandbox Code Playgroud)

我需要一些帮助来理解为什么添加>上述代码(即命令 1)仍然会创建多个文件,而命令 2 只创建一个文件。

Ste*_*itt 50

重定向(>在本例中)\xe2\x80\x9c使用\xe2\x80\x9d以下参数作为重定向的目标;其他一切都不管。所以

\n
echo 'hi' | tee > a b c\n
Run Code Online (Sandbox Code Playgroud)\n

相当于

\n
echo 'hi' | tee b c > a\n
Run Code Online (Sandbox Code Playgroud)\n

tee将其输入复制到bc,并将标准输出复制到a

\n
echo 'hi' > a b c\n
Run Code Online (Sandbox Code Playgroud)\n

相当于

\n
echo 'hi' b c > a\n
Run Code Online (Sandbox Code Playgroud)\n

并输出hi b c到标准输出,该输出到a.

\n

  • 另请参阅 `echo hi > a > b > c` 或 `echo hi > {a,b,c}`,它在 `zsh` 中执行内部 `tee` 操作。 (2认同)

小智 17

这是基本的 shell 语法。重定向运算符>仅接受一个参数,该参数用作将标准输出重定向到的文件名。其余参数将传递给命令。

所以你的第一个命令:

echo 'hi' | tee > a b c
Run Code Online (Sandbox Code Playgroud)

运行命令echo 'hi' | tee b c,将其标准输出重定向到 file a。碰巧,tee将其标准输入复制到作为参数给出的所有文件以及其标准输出。因此,发出的数据echo 'hi'被复制到teefilesbc,并复制到其标准输出(通过重定向为 file )a

你的第二个命令:

echo 'hi' > a b c
Run Code Online (Sandbox Code Playgroud)

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


bxm*_*bxm 12

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
Run Code Online (Sandbox Code Playgroud)

  • @catwith 进一步强调这一点, `echo > abc` 也可以是 `> a echo bc` (5认同)
  • _"> 文件名" 可以出现在 | 一侧的任何位置 (只要它的间隔适当并且不被转义)。_这一行很好地解释了我不理解的命令执行行为。谢谢。 (2认同)