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"エラーが発生します。

その行がこのようになってはならないと確信していますか?

eval "$mux"

...$muxシェルコマンドラインで解析して、すべてのスペースと二重引用符を文字通り処理するのではなく、シェル構文として解釈しますか?

またはもっと簡単に...まず、引用mkvmergeしたコマンドを作成し、それを変数に入れてから、変数をコマンドとして実行せずに、正しいパラメータをすべて使用して実行します。

おすすめ記事