我正在执行命令
ls > a.txt | sort > b.txt
该命令正在执行以下操作:
执行
ls
排序
创建
a.txt
排序输出并将其存储到a.txt
创造
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
.相反,您可以使用tee
which同时做2件事:
- 将 STDIN 定向到文件
- 将 STDIN 定向到 STDOUT
其结果是将 STDIN(您的ls
命令)保存到文件中,并将其继续输出到 STDOUT 以在命令中使用sort
。这是您正在使用的修改后的命令:
ls | tee a.txt | sort > b.txt