나는 이 참조를 성공하지 못한 채 작동시키려고 노력했습니다.
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
(매개변수를 내부로 래핑 하고 로 '...'
변경 ).'
'\''