Parameter

如果提供了標準輸入或文件名,是否應該丟棄兩者?

  • December 30, 2012

grep如果您提供文件名參數,sed則忽略標準輸入:

$ echo foo > test.txt
$ echo foobar | grep f test.txt 
foo
$ echo foobar | sed -e 's/foo/bar/' test.txt 
bar

這是既定的最佳實踐嗎?如果是這樣,為什麼?

程序知道是否在其命令行上指定了文件。它無法知道 stdin 上是否有任何可用的輸入(除了嘗試讀取它),如果有輸入,程序就無法知道該輸入是否是為它準備的。因此,唯一明智的選擇是製定一個明確的規則,根據程序的呼叫方式(命令行參數、環境變數、配置文件……)來決定它是否會從標準輸入中讀取。

例如,典型的文本實用程序 ( cat, sort, grep, awk, perl -p, …) 如果沒有提供文件則從標準輸入讀取,如果有則從指定的文件讀取。解釋器遵循類似的約定,例如sh沒有參數從標準輸入sh script_file_name讀取命令,同時從指定文件讀取命令(如果需要,腳本可以讀取標準輸入)。還有一個常見的約定是,如果-出現在需要輸入文件名的位置,程序將從標準輸入讀取。

考慮一個 shell 片段,如

somecommand | while read line; do
 process "$line"
done

您需要知道是否process從標準輸入讀取。沒有“測試是否提供了標準輸入”之類的東西:它在那裡,但是呼叫程序的使用者知道他是否希望讀取標準輸入。

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