Parameter
如果提供了標準輸入或文件名,是否應該丟棄兩者?
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
從標準輸入讀取。沒有“測試是否提供了標準輸入”之類的東西:它在那裡,但是呼叫程序的使用者知道他是否希望讀取標準輸入。