我正在写一个Bash脚本,我在其中逐行读取文件(确切地说,<(find /home/user/ -iname "*.MP4")
),对于我执行ffmpeg
的每一行,我正在做某事像这样:
while read -r line; do
ffmpeg -i "$line" [ MORE OPTIONS ... ]
done < <(find /home/user/ -iname "*.MP4")
虽然由于某种原因,只有第一行正在成功处理。
知道为什么我的代码会忽略所有其他行吗?
答案 0 :(得分:5)
这是ffmpeg
的特殊行为导致的常见问题(也发生在ssh
)。
引自Bash FAQ 89处理你的案件几乎完全:
这里发生了什么?我们来看第一个例子。 read从标准输入(FD 0)读取一行,将其放入file参数,然后执行ffmpeg。 与从BASH执行的任何程序一样,ffmpeg继承标准输入 ,由于某种原因它会读取。我不知道为什么。但无论如何,当ffmpeg读取stdin时, 会从find命令中吸取所有输入,使循环不足 。
有两个主要选项:
在</dev/null
行(即ffmpeg
)末尾添加ffmpeg -i "$line" [ MORE OPTIONS ] ... </dev/null
将解决问题,并使ffmpeg
按预期行事。< / p>
让read
从File Descriptor读取一个随机程序不太可能使用的内容:
while IFS= read -r line <&3; do
# Here read is reading from FD 3, to which 'file' is redirected.
done 3<file