“|”的行为Linux 中的管道带有“>”输出重定向

“|”的行为Linux 中的管道带有“>”输出重定向

我正在执行命令

ls > a.txt | sort > b.txt

该命令正在执行以下操作:

  1. 执行ls

  2. 排序

  3. 创建a.txt排序输出并将其存储到a.txt

  4. 创造b.txt,但其空的

谁能解释一下吗?

我正在实现我自己的 shell,我需要了解这种行为并模拟它。

答案1

|获取左侧命令的输出并将其提供给右侧命令的输入。操作>员将获取命令的输出并将其放入文件中。这意味着,在您的示例中,当到达 时,|已经没有输出了;一切都进入了a.txt。所以sort右边的操作是对一个空字符串进行操作并将其保存到b.txt

您可能想要的是使用tee既可以写入文件又可以写入标准输出的命令

ls | tee a.txt | sort > b.txt

虽然我真的很好奇你想做什么,因为ls也可以/将会为你整理事情。

答案2

ls > a.txt | sort > b.txt

你正在执行ls。然后你正在重定向仅标准输出ls命令进入a.txt.然后您尝试将 PIPE STDOUT 也通过 PIPE STDOUT 传输到排序命令的 STDIN。

因为 STDOUT 被重定向到文件中a.txt,所以排序命令的 STDIN 中没有任何内容要排序b.txt,这就是文件为空的原因。

有几种方法可以最终获得b.txt文件中预期的内容:

ls | sort > b.txt

或者

ls > a.txt ; cat a.txt | sort > b.txt

两者实际上都需要将 PIPE 左侧的 STDOUT 中的数据传递到 PIPE 右侧的 STDIN。

答案3

与 Tim 和 Eric 所说的类似,当您使用>将 STDOUT 重定向到文件时,不会留下任何东西可以通过|管道传输到sort.相反,您可以使用teewhich同时做2件事:

  • 将 STDIN 定向到文件
  • 将 STDIN 定向到 STDOUT

其结果是将 STDIN(您的ls命令)保存到文件中,并将其继续输出到 STDOUT 以在命令中使用sort。这是您正在使用的修改后的命令:

ls | tee a.txt | sort > b.txt

相关内容