"find"에서 시작된 "sh -c" 스크립트의 작은따옴표 문제

"find"에서 시작된 "sh -c" 스크립트의 작은따옴표 문제

나는 오랫동안 스크립트를 작성해 왔지만 최근 이 문제로 인해 미칠 지경이 되었습니다. 모든 방법을 시도했지만 해결되지 않았습니다.

find . -iname "*.mp4" -type f -exec ffmpeg -i "{}" -c:a "$ACODEC" -c:v "$VCODEC" -vf \
    "subtitles={}.$SUBEXTE:'force_style=fontsize=$FSIZE,fontname=$FNAME'" \
"{}.$EXTE" -hide_banner \;

findmp4 파일이 발견될 때마다 이 명령을 실행하는 것이 아이디어입니다 FFmpeg. 그러나 마지막 변수의 명령 대체와 같이 더 복잡한 것을 시도하려면 {}.$EXTE다음 구문을 사용해야 합니다.

find . -iname "*.mp4" -type f -exec sh -c 'ffmpeg -i "$1" -c:a "$2" -c:v "$3"\
 -vf "subtitles=$1.$4:'force_style=fontsize=$5,fontname=$6'" \
"$1.$7" -hide_banner' -- "{}" "$ACODEC" "$VCODEC" "$SUBEXTE" "$FSIZE" "$FNAME" "$EXTE" \;

이 구문을 사용할 때 볼 수 있듯이 sh -c작은따옴표를 추가해야 합니다 ' '. 그러나 이는 FFmpeg코드를 깨뜨립니다. 작은 따옴표와 큰 따옴표를 추가하고 제거하고 백슬래시도 시도하는 등 거의 모든 가능한 변형을 시도했습니다. 도와주세요! 내가 겪은 몇 가지 오류:

Unable to open ./sub.srt
[AVFilterGraph @ 0x7fffdb7d35e0] Error initializing filter 'subtitles' with args './sub.srt:force_style=fontsize='
Error reinitializing filters!
Failed to inject frame into filter network: No such file or directory
Error while processing the decoded data for stream #0:0
Conversion failed!
And sometimes I got an error like not suitable format for fontname

답변1

작은따옴표로 묶인 문자열에는 작은따옴표가 포함될 수 없습니다.

귀하의 경우 이 딜레마에 대한 해결책은 '인라인 스크립트 sh -c의 모든 내부를 '\''( 또는 '"'"')로 바꾸는 것입니다.

정리의 목적은

  1. 작은 따옴표로 묶인 문자열(첫 번째 '로 끝나는 '\''작은 따옴표 문자열)을 일시적으로 중단합니다.
  2. 텍스트를 삽입하려면 '( \'in '\'', "'"다음과 같이 작성할 수도 있습니다.멀리참고문헌이 너무 많아 읽기가 어렵습니다.)
  3. 이를 나머지 원래 작은 따옴표로 묶은 문자열과 연결합니다( 끝의 'in은 '\''새 작은 따옴표로 묶인 문자열을 시작합니다).

명령 sh -c은 다음과 같습니다

sh -c '
ffmpeg -i "$1" -c:a "$2" -c:v "$3" \
    -vf "subtitles=$1.$4:'\''force_style=fontsize=$5,fontname=$6'\''" \
    "$1.$7" -hide_banner' ...arguments as before ...

관련 정보