为什么在命令启动之前*bash重定向发生,如果">"在命令之后?

J.D*_*Doe 5 bash

最近我试图列出我所拥有的目录中的所有图像(几百个)并将它们放入文件中.我用了一个非常简单的命令

ls > "image_names.txt"
Run Code Online (Sandbox Code Playgroud)

我很无聊,决定查看文件内部并意识到image_names.txt位于文件中.然后我意识到,执行的操作顺序并不是我想的.我在两个单独的步骤中从左到右阅读命令:

  1. ls (首先列出所有文件名)
  2. > "image_names.txt" (然后创建此文件并在此处管道)

为什么创建该文件第一,然后列出所有在目录中的文件,尽管ls未来的第一个命令?

awi*_*ebe 2

当你使用输出重定向时,shell需要一个地方来放置你的输出(假设它很长,那么它可能会在终止时全部丢失,或者耗尽所有工作内存),所以第一步是打开输出文件进行流式传输执行命令的标准输出的输出。

在这种命令中了解这一点尤其重要

cat a.txt | grep "foo" > a.txt
Run Code Online (Sandbox Code Playgroud)

由于 a 首先打开并且不是在追加模式下,因此它将被截断,这意味着 没有输入cat。因此,您期望从 a.txt 中过滤行并替换 a.txt 的行为实际上不会发生。相反,您只会丢失 的内容a.txt