"sh -c" 안에 큰따옴표가 있는 인용문

"sh -c" 안에 큰따옴표가 있는 인용문

나는 이 참조를 성공하지 못한 채 작동시키려고 노력했습니다.

export perl_script='$| = 1;s/\n/\r/g if $_ =~ /^AV:/;s/Saving state/\nSaving state/'
mpv="command mpv"
mpvOptions='--geometry 0%:100%'
args=("$@")
$ sh -c "$mpv $mpvOptions ${args[*]} 2>&1 | perl -p -e $perl_script | tee ~/mpv_all.log"
syntax error at -e line 1, at EOF
Execution of -e aborted due to compilation errors.
sh: 1: =: not found
sh: 1: s/n/r/g: not found
sh: 1: s/Saving: not found

그래서 나는 이것을 시도했습니다 :

$ sh -c "$mpv $mpvOptions ${args[*]} 2>&1 | perl -p -e \"perl_script\" | tee ~/mpv_all.log"
Unknown regexp modifier "/h" at -e line 1, at end of line
Execution of -e aborted due to compilation errors.

인용문은 정말 골치 아픈 일입니다.

답변1

호출하는 쉘이 쉘 스크립트에 포함된 문자열에 대해 무엇을 하는지 걱정할 필요가 없다면 더 쉬울 것입니다. 인라인 스크립트 주위에 작은따옴표를 사용하고 해당 명령줄에서 필수 인수를 in에 전달할 수 있습니다.

perl_script='$| = 1;s/\n/\r/g if $_ =~ /^AV:/;s/Saving state/\nSaving state/'

sh -c 'p=$1; shift
       command mpv "$@" 2>&1 |
       perl -pe "$p" |
       tee "$HOME/mpv_all.log"' sh "$perl_script" "$@"

답변2

아마도 당신은 다음을 의미할 것입니다:

export perl_script='
  $| = 1;
  s/\n/\r/g if $_ =~ /^AV:/;
  s/Saving state/\nSaving state/'

mpv=(command mpv)
args=("$@")
sh -c '
  "$@" 2>&1 |
    perl -p -e "$perl_script" | tee ~/mpv_all.log
 ' sh "${mpv[@]}" "${args[@]}"

또는 이러한 모든 매개변수의 내용을 셸 코드로 포함하려는 경우:

shquote() {
  LC_ALL=C awk -v q=\' '
    BEGIN{
      for (i=1; i<ARGC; i++) {
        gsub(q, q "\\" q q, ARGV[i])
        printf "%s ", q ARGV[i] q
      }
      print ""
    }' "$@"
}

perl_script='
  $| = 1;
  s/\n/\r/g if $_ =~ /^AV:/;
  s/Saving state/\nSaving state/'

mpv=(command mpv)
args=("$@")

sh -c "
  $(shquote "${mpv[@]}" "${args[@]}") 2>&1 |
  perl -p -e $(shquote "$perl_script") | tee ~/mpv_all.log"

여기서 shquote구문의 매개변수를 참조합니다 sh(매개변수를 내부로 래핑 하고 로 '...'변경 ).''\''


관련 정보