bash 脚本中的 mkvmerge 不执行

bash 脚本中的 mkvmerge 不执行

我制作了一个脚本,它将一个视频文件、多个音频文件和多个字幕混合到一个 .mkv 中。

该脚本尝试运行:
"/usr/bin/mkvmerge" -o "test.mkv" "--default-track" "0:yes" "--forced-track" "0:no" "--display-dimensions" "0:853x462" "-d" "0" "-A" "-S" "-T" "(" "mux.mkv" ")" "--language" "0:eng" "--default-track" "0:yes" "--forced-track" "0:no" "--no-global-tags" "--no-chapters" "-a" "0" "-D" "-S" "-T" "(" "test_eng_1.opus" ")" "--default-track" "0:no" "--forced-track" "0:no" "--no-global-tags" "--no-chapters" "-a" "0" "-D" "-S" "-T" "(" "test_und_2.opus" ")" "--language" "0:eng" "--default-track" "0:no" "--forced-track" "0:no" "--no-global-tags" "--no-chapters" "-s" "0" "-D" "-A" "-T" "(" "test_eng_3.idx" ")" "--language" "0:fra" "--default-track" "0:no" "--forced-track" "0:no" "--no-global-tags" "--no-chapters" "-s" "0" "-D" "-A" "-T" "(" "test_fra_5.idx" ")" "--language" "0:spa" "--default-track" "0:no" "--forced-track" "0:no" "--no-global-tags" "--no-chapters" "-s" "0" "-D" "-A" "-T" "(" "test_spa_4.idx" ")" "--title" "test"

如果我运行脚本,它会显示:第 214 行:(上面的内容):没有这样的文件或目录

如果我复制并粘贴输出并在 bash 中运行它,则一切运行正常:

mkvmerge v7.7.0 ('Six Voices') 64bit built on Mar  3 2015 16:43:14 ... 
Muxing took 3 seconds.

以下是尝试运行 mkvmerge 的脚本部分:

213 mux="\"/usr/bin/mkvmerge\" -o \"$gname.mkv\" $muxvideo$muxaudio$muxsub$tacks$title"
214 "$mux"

为什么它在终端中运行而不是在脚本中运行?

答案1

您的脚本定义了一个变量mux,其值是您粘贴的长mkvmerge命令,字面上包含所有这些双引号和所有内容:请注意双引号如何反斜杠转义,以便它们字面地包含在字符串中。

然后它会:

"$mux"

它尝试运行一个以该变量的内容、空格和引号等命名的命令。由于没有名为"/usr/bin/mkvmerge" -o "test.mkv" "--default-track"etc... 的命令,因此您会收到错误。

你确定那条线不应该是这样吗?

eval "$mux"

...它会将 的内容解析$mux为 shell 命令行,从而将所有这些空格和双引号解释为 shell 语法,而不是按字面意思处理它?

或者更简单......只需mkvmerge使用所有正确的参数执行,而无需首先构建带引号的命令并将其填充到变量中,然后将变量作为命令执行。

相关内容