2013-11-26 77 views
3

當前我正在編寫一個小shell(重定向,管道,exec等)。一直試圖找出Linux shell在解決I/O重定向時所採取的步驟。Linux外殼中的I/O流重定向。 shell如何通過重定向來處理命令?

我需要什麼幫助上的一些問題:

  1. 在哪個方向從命令行讀取shell時它正在尋找重定向?從左到右還是相反?使用遞歸?

  2. shell需要尋找什麼情況? (不知道是否有很多或只是一對夫婦可以涵蓋很多的變化)

不管怎麼說,一些我能想到的是(糾正我,如果我錯了):

cmd > file1  # stdout of cmd goes to file 

cmd file1 > file2 # stdout of cmd with file1 as an argument goes to file2 

cmd file2 < file1 # stdin on file2 comes from file1 

現在我不知道以下情況下的過程(如shell查找和處理這些過程)。 殼採取的步驟是不爲人知我

cmd file2 > file3 < file1 # using "tee" in place of "cmd" I don't know 
          # how to do the dups and when to exec 

cmd file2 <file3> file1 # same^

回答

3

只要你只能重定向stdin和stdout,其中重定向被處理沒關係,最後的兩個例子是完全一樣的順序。

BASH從左向右處理IO重定向。

> cmd1 > file 2>&1 
> cmd2 2>&1 > file 

這兩個是不同的。在第一種情況下,我將stdout綁定到file,然後將stderr綁定到stdout:stderr和stdout現在都進入該文件。

在第二種情況下,我將(孩子的)stderr綁定到stdout(父級),然後找到孩子的stdout文件。結果是你現在在stdout上獲得了孩子的stderr輸出,並且stdout進入了該文件。例如,這對於在管道中處理標準錯誤非常有用。

如果你看一下BASH的源代碼,你可以看到一個命令的執行被分成幾個步驟:

  • 更換所有變量
  • 拆分輸入「字」
  • 處理IO重定向(並刪除涉及的單詞)
  • 使用正確的IO設置和其餘單詞作爲參數創建一個新的子進程。
+0

因爲它從左向右讀取三通 文件1> file2的 John

+0

編號再次閱讀,這是沒有意義的。你不能「設置file1輸出到file2」。文件是一個文件,它不是一個命令。 –

+1

'tee file1> file2