2009-09-06 104 views
4

(這是間接大得多家庭作業的一部分)入門標準輸入後,用戶輸入已被重定向,在Bourne腳本

我有類似

 
    while read LINE 
    do 
     stuff-done-to-$LINE 
     echo "Enter input:" 
     read INPUT 
     stuff-done-to-$INPUT 
    done < infile 

我找不到成功使用控制檯/默認stdin進行第二次讀取,而不是重定向的stdin。

需要是純Bourne腳本。

+0

我應詳細說明第一個問題......問題是針對我的解決方案的具體問題,而不是作業分配的一部分,但是我的代碼在非擴展Bourne中的要求是。 – Ashton 2009-09-06 10:47:45

+0

純Bourne腳本?你的意思是原始的bourne shell,而不是bash? – skaffman 2009-09-06 10:51:56

+0

是的,原裝Bourne外殼 – Ashton 2009-09-06 10:54:02

回答

3

我相信這是Bourne shell的支持:

exec 3<doc.txt 
while read LINE <&3 
do 
    stuff-done-to-$LINE 
    # the next two lines could be replaced by: read -p "Enter input: " INPUT 
    echo "Enter input:" 
    read INPUT 
    stuff-done-to-$INPUT 
done < infile 

輸入文件和用戶之間的交替。事實上,這將是一個很好的方式從文件發出一系列提示。

此重定向的文件「的infile」到文件描述符數3從該第一read獲取輸入。文件描述符0是stdin,1是stdout而2是stderr。你可以使用其他的FD和他們一起。

我測試過這對Bash和短跑(在我的系統SH被鏈接到DASH)。

當然,它的工作原理。下面是一些更有趣:

exec 3<doc1.txt 
exec 4<doc2.txt 
while read line1 <&3 && read line2 <&4 
do 
    echo "ONE: $line1" 
    echo "TWO: $line2" 
    line1=($line1) # convert to an array 
    line2=($line2) 
    echo "Colors: ${line1[0]} and ${line2[0]}" 
done 

這種交替印刷的兩個文件的內容,捨棄多餘的線條取的文件是更長的時間。

ONE: Red first line of doc1 
TWO: Blue first line of doc2 
Colors: Red and Blue 
ONE: Green second line of doc1 
TWO: Yellow second line of doc2 
Colors: Green and Yellow 

Doc1只有兩行。 doc2的第三行和後續行被放棄。

+0

如果有效,我學到了一些新東西。謝謝。 – 2009-09-07 21:29:57

+0

項目和問題早已消失,但我回去檢查了相關的shell ...是的,它確實支持文件描述符,所以你的第一個例子應該已經工作了。 數組的第二個示例失敗...原始bourne shell中沒有數組。 – Ashton 2009-10-16 07:35:34

-2

你不能。沒有默認的標準輸入和重定向標準輸入。有stdin,它連接的是控制檯或文件。

您可以做的唯一事情就是在文件的行數上使用計數器。然後,使用sed或tail + head的一些智能使用來提取每一行。您不能使用while read line,因爲您無法區分讀取和控制檯讀取和文件讀取。

+0

謝謝,我很害怕這樣。我可以用不同的方式重寫它,但如果文件非常大,tail + head會有點討厭,而sed並不會更好。 – Ashton 2009-09-06 11:31:05

+0

然後你使用的是錯誤的工具 – 2009-09-06 12:30:13

+1

是的,你可以 - 在/ dev/tty上看到我的回答。 – 2009-09-11 09:24:14

1

這應該工作:

for LINE in `cat infile`; do 
    stuff-done-to-$LINE 
    echo "Enter input:" 
    read INPUT 
    stuff-done-to-$INPUT 
done 
+0

+1:是和否。這會給你一個單詞列表,而不是行列表。您必須將IFS更改爲明確輸入才能正常工作,如果您不小心和/或恢復內部代碼,可能會對內部代碼造成嚴重後果。 – 2009-09-06 12:37:52

2

可以讀/由/ dev/tty的寫用戶的終端,這是獨立的什麼外殼使用的是和標準輸入/輸出時是否重定向,所以你只需要:

echo "Enter input:" > /dev/tty 
read INPUT < /dev/tty 
相關問題