逐行处理命令输出,不混合标准输入

aul*_*ron 5 shell bash pipe stdin

所以,我有一个与Bash非常相似的问题:如何从命令的输出中一次读取一行?, 我在做:

while read path; do mplayer $path; done < <(find-me-random-mp3s)
Run Code Online (Sandbox Code Playgroud)

或者

find-me-random-mp3s | while read path; do mplayer $path; done
Run Code Online (Sandbox Code Playgroud)

该命令find-me-random-mp3s在一个新行上输出每个文件路径。问题在mplayer运行时开始,它开始消耗find-me-random-mp3s输出中的行,即应该path在每次迭代时填充在变量内的行。

我继续这个肮脏的修复:

find-me-random-mp3s | while read path; do cat /dev/null | mplayer $path; done
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢它,它也阻止了我与 mplayer 的终端交互。

在这种情况下,我可以使用任何替代方法吗?

gle*_*man 5

您可以使用不同的文件描述符:

exec 3< <(find-me-random-mp3s)
while IFS= read -r -u3 path; do mplayer "$path"; done
exec 3<&-
Run Code Online (Sandbox Code Playgroud)


Joh*_*024 4

exec 3<&0
while read line
do
    mplayer "$line" <&3
done < <(find-me-random-mp3s)
Run Code Online (Sandbox Code Playgroud)

这会将终端输入复制到文件描述符 3。在 while 循环中,find-me-random-mp3s除了mplayer从文件描述符 3(即终端)获取其 stdin 的行之外,从程序中的所有位置都读取 stdin。因此,您仍然可以与 进行交互mplayer