
ビデオファイル、複数のオーディオファイル、複数の字幕を.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"
エラーが発生します。
その行がこのようになってはならないと確信していますか?
eval "$mux"
...$mux
シェルコマンドラインで解析して、すべてのスペースと二重引用符を文字通り処理するのではなく、シェル構文として解釈しますか?
またはもっと簡単に...まず、引用mkvmerge
したコマンドを作成し、それを変数に入れてから、変数をコマンドとして実行せずに、正しいパラメータをすべて使用して実行します。