Command-Line
標準輸入和命令行參數之間的性能差異
對於某些命令,可以將某些輸入指定為標準輸入或命令行參數。
具體來說,假設
command
可以將標準輸入和文件名作為命令行參數,並且command < myfile
,cat myfile | command
和command myfile
可以產生相同的結果。例如,
當命令是
sed
:sed s/day/night/ <myfile >new sed s/day/night/ myfile >new cat myfile | sed s/day/night/ >new
當命令是
cat
:cat < myfile cat myfile
- 我想知道他們的表現是否有一些一般規則,即其中哪一個通常是最有效的,哪一個最不高效?
- 重定向總是比管道好嗎?
該
cat file | command
語法被認為是無用的Cat
。在所有選項中,它會影響性能,因為它必須在核心中生成另一個程序。然而,這在大局中可能會變得微不足道,這是其他形式所沒有的成本。這已涵蓋以下問題:我應該關心不必要的貓嗎?其他兩種形式之間幾乎沒有性能差異。STDIN 是一個特殊的文件節點,程序必須像任何其他節點一樣打開和讀取它。傳遞文件名而不是 STDIN 只會使它打開一個不同的文件。
不同之處在於您正在尋找什麼功能/靈活性。
- 將文件名傳遞給程序意味著輸入文件是可搜尋的。這對程序可能很重要,也可能無關緊要,但是如果流是可搜尋的,則可以加快某些操作。
- 知道實際的輸入文件可以讓你的程序潛在地寫入它。例如
sed -i
就地編輯。(注意:由於這必須在幕後創建一個新文件,因此它不會比其他重定向帶來性能提升,但它是一個方便的步驟。)- 使用 shell 重定向使您能夠連接多個文件,甚至可以使用程序重定向。
sed [exp] < file1 file2
甚至sed [exp] < <(grep command)
。這個案例的細節可以在這個問題上找到:程序替換和管道