따옴표 안에 있는 긴 명령줄을 안전하게 끊는 방법이 있습니까?

따옴표 안에 있는 긴 명령줄을 안전하게 끊는 방법이 있습니까?

다소 복잡한 명령을 작성했습니다. 왜냐하면 여러개의 따옴표 ' '" "따옴표가 있기 때문입니다 . 그리고 탈출 조건 '\''(어떤 이유로든 그 사용법은 필수입니다. 많이 조사했습니다). \따옴표로 줄을 끊으려고 했는데 나머지 부분이 명령으로 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의 전체 경로를 사용하세요.

관련 정보