如果你的標準輸入已經從一個文件重定向(也就是你./yourscript <file
被調用的),然後使用/dev/tty
從終端讀取:
#!/bin/bash
exec 3</dev/tty || {
echo "Unable to open TTY; this program needs to read from the user" >&2
exit 1
}
while IFS= read -r line; do # iterate over lines from stdin
if [[ $line = Q ]]; then
echo "Getting input from the user to process $line" >&2
read -r answer <&3 # read input from descriptor opened to /dev/tty earlier
else
echo "Processing $line internally"
fi
done
如果你想通過跳過exec 3</dev/tty
起來頂(開放/dev/tty
只是一次在腳本的開頭,允許從TTY讀取以後與<&3
完成),那麼你可以代替寫:
read -r answer </dev/tty
...每次你想從終端讀取時打開它。但是,對於在循環中這些場合失敗的情況,您希望確保具有錯誤處理功能(例如,如果此代碼是從cron作業運行的,則將ssh
命令與命令作爲參數傳遞並且沒有-t
,或者類似的情況,其中是否TTY)。
或者,考慮比其他標準輸入一個描述符打開你的文件 - 在這裏,我們使用的文件描述符#3文件輸入,並承擔調用爲./yourscript file
(:標準輸入指向終端):
#!/bin/bash
filename=$1
while IFS= read -r line <&3; do # reading file contents from FD 3
if [[ $line = Q ]]; then
echo "Getting input from the user to process $line" >&2
read -r answer # reading user input by default from FD 0
else
echo "Processing $line internally" >&2
fi
done 3<"$filename" # opening the file on FD 3
stdin不是命令行輸入;編輯以引用「終端輸入」。 –
(「命令行輸入」意味着參數實際上放在你程序的命令行中,如'./yourprogram「第一個答案」「第二個答案」「第三個答案」) –
@CharlesDuffy好的呼叫,我改變了它在問題 –