2017-04-15 31 views

回答

1

它的工作原理,因爲它預計:

cat命令按順序讀取文件,將它們寫入標準輸出爲 。文件操作數按命令行順序處理 。如果文件是單個短劃線(` - ')或不存在,則cat從標準輸入中讀取。

創建一些演示文件:

for i in 1 2 3; do echo this is d$i > d$i; done 

cat d1顯示

this is d1 

這是你有什麼期望 - 在d1cat的說法。該cat < d3顯示

this is d3 

再次,它的工作原理是應該 - 在這裏沒有任何說法,因此貓顯示它的標準輸入。於是最後,

cat d1 - d3 < d2顯示

this is d1 
this is d2 
this is d3 

例如貓讀取它的參數,例如首先d1隨後找到了-(作爲stdin指示器,顯示d2因爲(< d2),並與d3作爲參數的最後一個文件繼續進行。當然,

cat - d1 d3 < d2 

將顯示

this is d2 
this is d1 
this is d3 

每個程序在默認情況下連接3個文件描述符。該stdinstdoutstderr什麼程序與他們,(以及如何)它完全在給定的計劃責任。 cat按照文檔中的描述進行設計,例如,它從他的參數打印到stdout文件(並在內部使用fopen打開它們,並從打開的描述符中讀取文件內容),並在找到-(或沒有參數)時讀取stdin。所以,你的問題:

cat d1 < d2 

會發現d1作爲參數,所以貓打開文件d1並打印出來的內容。而因爲這裏是不是-,完全忽略了stdin而且只打印

this is d1 

還要注意,3所默認描述std(in|out|err)已連接到進程始終。即使啓動過程沒有的shell。讓我們從一些守護進程來說,或者從你的程序直接使用fork/exec。區別在於:當它從shell啓動時,shell已將上述所有描述符連接到您的終端。所以,當你要運行cat的:

  • fork S本身(例如,在這裏會是兩個相同的過程和上同時運行並排側 - 家長和孩子之間的只有差異。兩個是PID)。
  • 分叉進程具有與父進程相同的描述符,例如,它們連接到終端,或者,如果在子shell中進行一些重定向,那麼exec會將標準描述符替換爲給定文件中的描述符。 (見dup(2)系統調用)
  • 下一個,孩子被替換爲cat程序(exec
0

這不是一個shell的問題,但由於方式cat的行爲。

要麼cat

  1. 從標準輸入(如果沒有文件給定參數)
  2. 從參數讀取讀取指定的文件

但不同時(在基本行爲)。正如您以file2.txt作爲參數cat僅讀取該文件並忽略其標準輸入(從file1.txt重定向)。

存在一個特殊的參數來強制讀取標準輸入(-),您必須使用cat來考慮重定向。

相關問題