当逐行读取文件时,我只能在第一行执行ffmpeg

Shm*_*uel 4 bash video ffmpeg

我正在编写一个Bash脚本,我在其中逐行读取文件(<(find /home/user/ -iname "*.MP4")确切地说),对于我执行的每一行ffmpeg,所以我做的是这样的:

while read -r line; do
    ffmpeg -i "$line" [ MORE OPTIONS ... ]
done < <(find /home/user/ -iname "*.MP4")
Run Code Online (Sandbox Code Playgroud)

虽然,由于某种原因,只有第一行正在成功处理.

知道为什么我的代码忽略了所有其他行吗?

Ran*_*ein 5

这是一个常见的问题,是由ffmpeg(也发生在ssh)的特殊行为引起的.

引自Bash FAQ 89 几乎完全处理你的案例:

这里发生了什么事?我们来看第一个例子.read从标准输入(FD 0)读取一行,将其放入file参数,然后执行ffmpeg.与从BASH执行的任何程序一样,ffmpeg继承标准输入,由于某种原因它会读取.我不知道为什么.但无论如何,当ffmpeg读取stdin时,它会从find命令中吸取所有输入,使循环挨饿.

TL; DR:

有两个主要选择:

  • </dev/null在行的末尾添加a ffmpeg(即ffmpeg -i "$line" [ MORE OPTIONS ] ... </dev/null)将解决问题,并使ffmpeg行为符合预期.

  • 让我们read从一个不太可能被随机程序使用的文件描述符中读取:

       while IFS= read -r line <&3; do
           # Here read is reading from FD 3, to which 'file' is redirected.
       done 3<file
    
    Run Code Online (Sandbox Code Playgroud)