Bash

逐行處理命令輸出,不混合標準輸入

  • January 4, 2014

所以,我有一個與 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<&-

引用自:https://unix.stackexchange.com/questions/107727