是否有一種簡單的方法在我的bash腳本中「倒回」/dev/stdin
,該腳本已經從輸入管道讀取了全部或部分內容?在bash腳本中倒回stdin
應用:我寫了一個簡單的MDA,在第1部分,從fetchmail的逐行讀取單個電子郵件,像這樣:
while read -a linA; do
echo -e "$[++linenum]:\t${#linA[@]},${linA[*]}" > /dev/null # verbose
[ "${linA[0]}" = "Date:" ] && unset linA[0] && mailDate="${linA[*]}"
[ "${linA[0]}" = "Subject:" ] && unset linA[0] && mailSubject="${linA[*]}"
[ "$mailSubject" = "Courtesy Fill Notification" ] || break # if wrong subject then thank you, we're done with this mail
done
,並在處理結束時,我希望保存整個消息寫入一個文件中,以便進行調試,並且管道的寫入器端可以看到它的整個輸出已經被讀取,並且不會返回失敗(因此將郵件保持爲未讀取在郵箱中)。
++退出循環,因爲我喜歡你的bash技巧在前三個代碼行中。無論如何,我的mda.sh腳本總是以非交互方式使用......即使是爲了測試,我也會重定向/將測試文件cat給它。 – Marcos 2012-02-16 15:38:26
出於好奇,你試圖尋找什麼代碼來獲得'ESPIPE'錯誤?我可能會用於非管道情況。 – Marcos 2012-02-16 16:12:19
我實際上運行了一個我編寫/生成的程序,名爲「errno」,它打印出與數字指定的錯誤編號或字符串(我指定的ESPIPE)對應的信息。如果你這樣做,你會得到它:'int p [2],e;管(P); lseek(p [0],-1L,2); e = errno; printf(「%d(%s)\ n」,e,strerror(e));',除了符號名稱比這更難獲取。 (我有一個Perl腳本來生成'errno'的實際代碼。) – 2012-02-16 16:38:50