我試過這個命令,它輸出了file2.txt。爲什麼會發生?我問這個問題,因爲我寫的交流外殼,所以也許你知道如何避免這個問題cat <file1.txt file2.txt是如何解釋的?
回答
它的工作原理,因爲它預計:
cat命令按順序讀取文件,將它們寫入標準輸出爲 。文件操作數按命令行順序處理 。如果文件是單個短劃線(` - ')或不存在,則cat從標準輸入中讀取。
創建一些演示文件:
for i in 1 2 3; do echo this is d$i > d$i; done
的cat d1
顯示
this is d1
這是你有什麼期望 - 在d1
是cat
的說法。該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個文件描述符。該stdin
,stdout
和stderr
什麼程序做與他們,(以及如何)它完全在給定的計劃責任。 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
)
這不是一個shell的問題,但由於方式cat
的行爲。
要麼cat
:
- 從標準輸入(如果沒有文件給定參數)
- 從參數讀取讀取指定的文件
但不同時(在基本行爲)。正如您以file2.txt
作爲參數cat
僅讀取該文件並忽略其標準輸入(從file1.txt
重定向)。
存在一個特殊的參數來強制讀取標準輸入(-
),您必須使用cat
來考慮重定向。
- 1. 用grep -n(數據)FILE1.TXT> FILE2.TXT
- 2. 字符串(FILE1.TXT)從FILE2.TXT
- 3. 在tcsh中,如果文件存在,cat file1.txt> file2.txt不起作用
- 4. 循環中FILE1.TXT在FILE2.TXT的所有行每行比較
- 5. Java無法打印所有從file1.txt到file2.txt的行?
- 6. 提取file1.txt行並使用shell合併到file2.txt?
- 7. 對於如果它存在於FILE2.TXT FILE1.TXT檢查每一個字符串,然後做一些事情
- 8. 如何獲得字符串變量值從「D:\\ Directory1 \\ file1.txt」到@「D:\ Directory1 \ file1.txt」
- 9. File1 +(File2 - first line)> File3
- 10. 如何在sed中使用變量'3d'../log/file2.txt> ../log/file8.txt
- 11. cmake:if(file1 IS_NEWER_THAN file2)是否損壞?
- 12. 測試file1中的行是否是file2中的行的子集
- 13. 製作瀏覽器解釋TXT爲HTML
- 14. 刪除內容:file1.csv - file2.csv powershell
- 15. 殼:從FILE1獲取一行內容FILE2
- 16. 如何閱讀解釋\ n的txt文件?
- 17. 如何從.txt文件製作.cat文件
- 18. 如何將file2.pdf中的頁面追加到file1.pdf
- 19. 如何從編號的txt文件讀取? (data1.txt,data2.txt等)
- 20. 如何解析c#中的txt文件
- 21. 在UNIX中,「cat file1> file1做了什麼?」
- 22. 如何使用UNIX查找找到(file1或file2)?
- 23. 從字符串像子文件夾1/file1.txt的子串C
- 24. 解析txt文件
- 25. 解析.txt文件
- 26. 以下是做什麼:(一些命令)> file1 file2
- 27. 如何解析txt網絡服務
- 28. Ruby:如何在xls中解析txt?
- 29. Java的txt解析器
- 30. 如何從file1中提取行,基於它的/ file1(僅)的第一列與linux中的file2的匹配信息?