我制作了一个脚本,它将一个视频文件、多个音频文件和多个字幕混合到一个 .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
使用所有正确的参数执行,而无需首先构建带引号的命令并将其填充到变量中,然后将变量作为命令执行。