다소 복잡한 명령을 작성했습니다. 왜냐하면 여러개의 따옴표 ' '
와 " "
따옴표가 있기 때문입니다 . 그리고 탈출 조건 '\''
(어떤 이유로든 그 사용법은 필수입니다. 많이 조사했습니다). \
따옴표로 줄을 끊으려고 했는데 나머지 부분이 명령으로 find
인식되지 않는 문제가 발생했습니다. ffmpeg
또한 shellcheck.net
"따옴표 안에 줄을 묶지 마십시오."라고 나와 있습니다. 어떻게 하면 안전하게 할 수 있나요? 코드는 다음과 같습니다.
#!/usr/bin/env sh
a="copy"
v="h264"
exts="srt"
f="50"
n="Arial"
sudo find . -iname "*.mp4" -exec sh -c 'ffmpeg -i "$1" -c:a "$2" -c:v "$3" -vf \
"subtitles="${1%.*}.$4":'\''force_style=fontsize="$5",fontname="$6"'\''" \
-map_metadata -1 "$1.${1##*.}" -hide_banner' -- "{}" "$a" "$v" "$exts" "$f" "$n" \;
답변1
작은따옴표와 백슬래시로 줄을 끝내고 작은따옴표(공백 없음!)로 다음 줄을 시작하는 것을 고려해 보셨나요?
...'\
'...
답변2
스크립트가 sh 대신 bash를 사용하는 경우 배열을 사용하여 찾고 있는 인수를 보유할 수 있습니다. 배열 리터럴에는 임의의 공백이 허용됩니다.
find_args=(
.
-iname "*.mp4"
-exec sh -c '
ffmpeg \
-i "$1" \
-c:a "$2" \
-c:v "$3" \
-vf "subtitles=${1%.*}.$4:'\''force_style=fontsize=$5,fontname=$6'\''" \
-map_metadata \
-1 "$1.${1##*.}" \
-hide_banner
' -- "{}" "$a" "$v" "$exts" "$f" "$n" \;
)
sudo find "${find_args[@]}"
을 얻으면 ffmpeg: not found
루트의 PATH에 없는 디렉토리에 있는 것입니다. 대신 ffmpeg의 전체 경로를 사용하세요.