【问题标题】:When reading a file line by line, I only get to execute ffmpeg on the first line逐行读取文件时,我只能在第一行执行 ffmpeg
【发布时间】:2016-08-03 17:20:02
【问题描述】:

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

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

尽管出于某种原因,只有第一行被成功处理。

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

【问题讨论】:

  • 尝试在ffmpeg 行上方的循环内添加另一行...echo Processing $line。或尝试将您的 shebang 线路更改为 #!/bin/bash -xv

标签: bash video ffmpeg


【解决方案1】:

这是由ffmpeg 的特殊行为引起的常见问题(ssh 也会发生)。

引自Bash FAQ 89 处理您的情况几乎完全正确

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

TL;DR :

有两个主要选项:

  • ffmpeg 的行尾添加&lt;/dev/null(即ffmpeg -i "$line" [ MORE OPTIONS ] ... &lt;/dev/null)将解决问题并使ffmpeg 的行为符合预期。

  • 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
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2010-12-26
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多