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 的终端交互。
在这种情况下,我可以使用任何替代方法吗?
您可以使用不同的文件描述符:
exec 3< <(find-me-random-mp3s)
while IFS= read -r -u3 path; do mplayer "$path"; done
exec 3<&-
Run Code Online (Sandbox Code Playgroud)
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。