【问题标题】:bash scripting: pass string containing multiple parameters and filenames with spaces to ffmpegbash脚本:将包含多个参数的字符串和带空格的文件名传递给ffmpeg
【发布时间】:2017-01-10 08:21:07
【问题描述】:

我有一个脚本,它会生成一个包含以下条目的文本文件:

-ss 5.5 -i "/path/vid 1.mp4" -t 3 "/path/vid out1.mp4"

但是当我调用带有此字符串的 ffmpeg 时,它会失败。 如果我引用变量,则 ffmpeg 将整个字符串视为单个选项,错误“找不到选项”。 如果我不引用,那么由于某种原因,ffmpeg 会忽略双引号并报告 "/path/vid :No such file or directory.

即使它将输入正确打印为 -i "/path/vid 1.mp4"。

用单引号替换文件名周围的双引号没有帮助。 但是当我将字符串传递给 zenity 然后手动将其复制到终端时,它可以工作:

zenity --entry --entry-text "ffmpeg -nostdin $line2"

所以我尝试将整个命令分配给一个 var 然后运行 bash $var 或 exec $var,但没有运气。将其分配给别名也不起作用:“找不到命令”

Joan Estaban 的解决方案:

echo $stringvar | xargs ffmpeg

演示问题的简短完整脚本:

#!/bin/bash


fffile="/home/vume5/Desktop/dwhelper/bud grafting animation.mp4"

line="-ss 4.920000 -i \"$fffile\" -t 60.000000 -map 0 -c:v copy -c:a copy \"$fffile.cut.mkv\""

zenity --entry --entry-text "$line"

ffmpeg $line

read dummy

【问题讨论】:

  • 手动尝试命令ffmpeg -ss 5.5 -i "/path/vid 1.mp4" -t 3 "/path/vid out1.mp4" 有效吗?
  • 是的。我认为问题在于双引号被视为文件名字符。这就是它的样子。我不知道如何防止这种情况发生。
  • 只是猜测,但这有帮助吗? -ss 5.5 -i "\"/path/vid 1.mp4\"" -t 3 "\"/path/vid out1.mp4\""
  • 不。然后是 ""/path/vid :no such file.. 问题似乎是相反的。引号不会被解释,并被视为文件名字符。
  • 你可以试试xargs:cat my_params.txt | xargs -l ffmpeg

标签: linux bash ffmpeg


【解决方案1】:

如果您有一个包含每次执行所需参数的文本文件,您可以使用 xargs:

cat my_list_of_params.txt | xargs -l ffmpeg

这执行 ffmpeg 的次数与文件中的行数一样多。参数 -l 表示文件中的每一行都必须执行一次 ffmeg

【讨论】:

    【解决方案2】:

    如果您的参数可能包含空格和/或其他特殊字符,那么您可以使用数组来存储它们。

    例如:

    params=(-ss 5.5 -i "/path/vid 1.mp4" -t 3 "/path/vid out1.mp4")
    mycommand "${params[@]}"
    

    【讨论】:

      猜你喜欢
      • 2012-12-02
      • 2014-04-13
      • 2022-11-14
      • 2017-09-04
      • 2016-09-15
      • 1970-01-01
      • 2016-04-18
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多