Bash
逐行處理命令輸出,不混合標準輸入
所以,我有一個與 Bash 非常相似的問題:如何從命令的輸出中一次讀取一行?, 我在做:
while read path; do mplayer $path; done < <(find-me-random-mp3s)
或者
find-me-random-mp3s | while read path; do mplayer $path; done
該命令
find-me-random-mp3s
在新行上輸出每個文件路徑。問題在mplayer
執行時開始,它開始消耗find-me-random-mp3s
輸出中的行,即應該path
在每次迭代時填充到變數中的行。我繼續這個骯髒的修復:
find-me-random-mp3s | while read path; do cat /dev/null | mplayer $path; done
但我不是很喜歡它,它也阻止了我與 mplayer 的終端互動。
在這種情況下我可以使用任何替代方法嗎?
exec 3<&0 while read line do mplayer "$line" <&3 done < <(find-me-random-mp3s)
這會將終端輸入複製到文件描述符 3。在 while 循環中,除了從作為終端的文件描述符 3 獲取其標準輸入
find-me-random-mp3s
的行之外,在任何地方都可以從您的程序中讀取標準輸入。mplayer
因此,您仍然可以與mplayer
.
您可以使用不同的文件描述符:
exec 3< <(find-me-random-mp3s) while IFS= read -r -u3 path; do mplayer "$path"; done exec 3<&-