如果“>”在命令之后,为什么bash重定向会在命令开始之前*发生?

时间:2018-10-20 04:56:27

标签: bash

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

ls > "image_names.txt"

我很无聊,决定浏览文件内部,意识到 image_names.txt 位于文件中。然后我意识到,执行的操作顺序不是我所想的。我分两个步骤从左至右阅读该命令:

  1. ls (首先列出所有文件名)
  2. > "image_names.txt" (然后创建此文件并将其通过管道传输到此处)

为什么先创建文件{strong> ,然后列出目录中的所有文件,尽管首先发出ls命令?

1 个答案:

答案 0 :(得分:2)

使用输出重定向时,shell需要一个放置输出的位置(假设它很长,那么在终止时可能会丢失所有内容,或者耗尽所有工作内存),因此第一步是打开输出文件,用于从执行的命令的标准输出中流式输出。

了解这种命令特别重要

cat a.txt | grep "foo" > a.txt

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