我正在 BASH 中創建一個腳本(myscript.sh),它從 STDOUT 讀取,通常是來自 cat 或來自檔案的資料流并輸出資料流(太棒了!),如下所示:
$cat myfile.txt
你好世界!
$cat myfile.txt | 腳本檔案
你好世界!
$myscript.sh 我的檔案.txt
你好世界!
但我也想要以下行為:如果我不帶引數呼叫腳本,我希望它輸出一個簡短的幫助:
$myscript.sh
我是幫助:我只是列印你說的話。
== 問題 ==
問題是我正在捕獲這樣的資料流:
if [[ $# -eq 0 ]]; then
stream=$(cat <&0)
elif [[ -n "$stream" ]]; then
echo "I am the help: I just print what you say."
else
echo "Unknown error."
fi
當我不帶這樣的引數呼叫腳本時: $myscript.sh
它應該列印“幫助”部分,但它只是繼續等待上面代碼第 2 行中的資料流......有沒有辦法告訴 bash 如果沒有來自 STDOUT 的內容只是中斷并繼續執行?
提前致謝。
uj5u.com熱心網友回復:
總是有一個標準輸入流;如果沒有給出引數并且輸入沒有被重定向,標準輸入就是終端。
如果您想特別對待它,請用于test -t
測驗標準輸入是否連接到終端。
if [[ $# -eq 0 && -t 0 ]]; then
echo "I am the help: I just print what you say."
else
stream=$(cat -- "$@")
fi
沒有必要測驗$#
。只需將您的論點傳遞給cat
; 如果它得到檔案名,它將從它們中讀取,否則它將從標準輸入中讀取。
uj5u.com熱心網友回復:
我同意@Barmar 的解決方案。
但是,完全避免您的程式行為取決于輸入檔案描述符是否為終端的情況可能會更好(有些情況下即使沒有終端也會被模仿——在這種情況下,您的腳本只會產生幫助字串)。
您可以改為引入一個特殊-
引數來顯式請求從標準輸入讀取。這將導致更簡單的選項處理和腳本的統一行為,無論環境如何。
uj5u.com熱心網友回復:
第一個答案是幫助自己 - 嘗試使用bash -x myscript.sh
. 它將包含很多資訊來幫助你。
如果您是特定情況,則條件$# -eq 0
被翻轉。根據要求,您要列印幫助訊息未提供引數:
if [[ $# -eq 0 ]] ; then
echo "I am the help: I just print what you say."
exit 0
fi
# Rest of you script, read data from file, etc.
cat -- "$@"
假設采用這種方法,并且如果要處理標準輸入或檔案,只需將“-”作為引數傳遞:cat foobar.txt | myscript.sh -
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496509.html
上一篇:Bash:如何在不使用輔助檔案的情況下將檔案編輯到自身
下一篇:匯出的路徑未在Python中更新