Io-Redirection

IO-Redirection Operator 何時執行?

  • January 23, 2020

我對 Linux 如何處理重定向運算符有點困惑。

我的主目錄中只有一個文件:

andy$: ls
demo.mp4

現在,如果我將ls輸出發送到文件,我應該只demo.mp4在文件中看到,因為目錄中除了這個文件之外什麼都沒有:

andy$: ls > myfile

但我實際上註意到myfile包含它自己!

andy$ cat myfile
demo.mp4
myfile <-- ???

所以這意味著在創建之後ls執行?myfile

就像是:

  1. 創造myfile
  2. 列出目錄內容ls
  3. 將內容(現在myfile存在)寫入myfile文件

因此,如果我需要排除我要重定向到的文件,我認為我應該這樣做:

ls | grep -v "myfile" > myfile

那麼首先,我說的對嗎?

如果是這樣,為什麼?我在哪裡可以找到這方面的更多資訊?

是的你是對的。

shell 在執行命令之前執行重定向。當 shell 執行命令時,它會根據需要設置新命令的標準輸入、輸出和錯誤。預設情況下,它們連接到終端(或外殼連接到的任何東西)。當存在重定向時,相關的文件描述符將連接到相應的文件(或管道等)。沒有緩衝等等——所以 shell 不會累積程序的輸出然後將其寫入文件;它將程序的輸出連接到文件並處理所有內容。

這意味著需要在執行命令之前打開文件。

您可以在關於 shell 語言的 POSIX 章節中找到更多相關資訊。第一部分列出了 shell 在執行命令之前執行的操作序列;您會看到重定向發生在命令執行之前。

引用自:https://unix.stackexchange.com/questions/459562