2012-01-16 115 views
14

所以我試圖做類似如下:讀取標準輸入用戶輸入一個文件時已經重定向到標準輸入

while read line; do 
    read userInput 
    echo "$line $userInput" 
done < file.txt 

所以說file.txt的有:

Hello? 
Goodbye! 

運行該程序將創建:

Hello? 
James 
Hello? James 
Goodbye! 
Farewell 
Goodbye! Farewell 

問題(自然)變成userinput讀取從stdin讀取,在我們的情況是file.tx噸。有沒有辦法改變它從臨時讀取到終端的位置以獲取用戶輸入?

注意:我正在使用的文件長度爲200,000行。每行大約有500個字符。如果需要的話

回答

24

而不是使用重定向,你可以打開file.txt一個文件描述符(例如3)所以記住這一點,並使用read -u 3從文件而不是從stdin閱讀:

exec 3<file.txt 
while read -u 3 line; do 
    echo $line 
    read userInput 
    echo "$line $userInput" 
done 

或者通過Jaypal辛格的建議,這可以寫成:

while read line <&3; do 
    echo $line 
    read userInput 
    echo "$line $userInput" 
done 3<file.txt 

這個版本的優點是,它也能在sh(該-u選項readsh中不起作用)。

+1

@jcollado雖然我有一個小建議,而不是在單獨的行上執行'exec',你可以將它寫成這樣 - 'read line <&3;做echo $ line;讀取userInput; echo「$ line $ userInput」;完成3 2012-01-16 23:12:45

+0

好的,我明白了,我不能刪除一個被接受的答案:/ – miku 2012-01-16 23:17:27

+0

@miku既然你允許我將它切換過來。 – 2012-01-17 03:18:27