비디오 파일, 여러 오디오 파일 및 여러 자막을 .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
먼저 인용된 명령을 작성하고 이를 변수에 넣은 다음 변수를 명령으로 실행하지 않고 올바른 매개변수를 모두 사용하여 실행하면 됩니다.