2010-01-02 92 views
5

我試圖從shell腳本中多次讀取stdin,但沒有運氣。其目的是首先讀取文件列表(這些文件是從stdin管道讀取的),然後再讀取兩次以交互地獲取兩個字符串。 (我試圖做的是讀取附加在電子郵件中的文件列表,然後是主題,最後是電子郵件正文)。在bash中多次讀取stdin

到目前爲止,我有這樣的:

photos=($(< /dev/stdin)) 

echo "Enter message subject" 
subject=$(< /dev/stdin) 

echo "Enter message body" 
body=$(< /dev/stdin) 

(加上錯誤檢查,我忽略了succintness代碼)

然而,這是因爲第二和第三重定向得到EOF得到一個空的主題和正文想必。

我一直試圖關閉並重新打開stdin < & - 和東西,但它似乎並沒有這樣工作。

我甚至嘗試使用分隔符作爲文件列表,使用「while; read line」循環並在檢測到分隔符時跳出循環。但是這也沒有奏效(??)。

任何想法如何構建這樣的東西?

回答

5

所以我落得這樣做是基於EZPZ的答案,這個文檔:http://www.faqs.org/docs/abs/HTML/io-redirection.html基本上我從提示的字段第一/ dev/tty,然後使用dup-and-close技巧讀取stdin:

# close stdin after dup'ing it to FD 6 
exec 6<&0 

# open /dev/tty as stdin 
exec 0</dev/tty 

# now read the fields 
echo "Enter message subject" 
read subject 
echo "Enter message body" 
read body 

# done reading interactively; now read from the pipe 
exec 0<&6 6<&- 
fotos=($(< /dev/stdin)) 

謝謝!

2

由於您可能有不同數量的照片,爲什麼不先提示已知字段,然後再閱讀「其他」。這比試圖以交互方式獲得未知長度的最後兩個字段要容易得多。

+0

不適用於我的原因是我正在嘗試使用管道傳遞照片列表。如果我簡單地閱讀列表之前的那些字段,則列表中的兩張第一張照片最終成爲主題和電子郵件正文,這不是我想要的。 (當然,我可以決定主題和主體必須通過輸入管道的前兩行,但對我來說這太難看了。) – alvherre 2010-01-02 21:46:09

3

你應該能夠使用read提示輸入主題和正文:

photos=($(< /dev/stdin)) 

read -rp "Enter message subject" subject 

read -rp "Enter message body" body 
+0

謝謝。如果我以交互方式輸入數據,那麼這將起作用。但是,如果我使用管道(這是我真正感興趣的),它不會。例如,我試圖做到這一點: cat/tmp/somephotoids | sed -e's /\(.*\)/ DSC_ \ 1.jpg /'| sendpics.sh 雖然我可以通過cut'n'pasting來解決這個問題,但我花了足夠的時間來這樣做,現在我認爲這是一種挑戰。 – alvherre 2010-01-02 21:45:38