따옴표로 묶어야 하는 명령에 값을 어떻게 전달합니까?

따옴표로 묶어야 하는 명령에 값을 어떻게 전달합니까?

ffmpeg를 사용하여 화면과 오디오를 녹음하는 스크립트를 만들려고 합니다. 사용자는 화면만, 마이크만, 스피커 소리만 또는 이들의 조합 중에서 무엇을 녹음할지 선택할 수 있습니다.

지금은 녹음 작업 중이에요. 처음에는 Alsa를 사용해 보았지만 녹음하는 동안 아무 소리도 들리지 않았습니다. 그런 다음 Pulseaudio를 사용해 보았지만 결과는 끔찍했습니다. 이제 OpenAL을 사용하려고 하는데 결과가 매우 좋습니다. 그러나 옵션에 공백이 있어 스크립트가 안정적으로 작동하도록 할 수 없습니다.

OpenAL 옵션은 다음과 같습니다.

[openal @ 0x55c6aa3b77a0] List of OpenAL capture devices on this system:
[openal @ 0x55c6aa3b77a0]   Áudio interno Estéreo analógico
[openal @ 0x55c6aa3b77a0]   Monitor of Áudio interno Estéreo analógico

명령줄에는 다음을 포함하여 사용자 옵션 및 화면 크기에 따라 다양한 변수가 있습니다.

env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough \
-vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi \
${monitorsom} "${openal}" ${micro} "${microal}" ${complexo}   \
-thread_queue_size 4096 -framerate 30  \
-f x11grab -s "$(xdpyinfo  | grep -oP 'dimensions:\s+\K\S+')" -i :0.0  \
-acodec libfdk_aac -b:a 192k \
-vf 'format=nv12,hwupload' -vcodec h264_vaapi \
-f flv "${nome}"

이 접근 방식의 가장 큰 문제는 변수입니다.모니터 솜,열려 있는,마이크로,미량원소그리고복잡한비어 있을 수 있습니다. 괜찮아요모니터 솜,마이크로그리고복잡한, 결과 명령은 괜찮습니다. 그러나 만일열려 있는또는미량원소비어 있으면 ffmpeg 명령이 실패합니다. 옵션을 선택하지 않은 경우(소리 없음) 전달되는 명령은 다음과 같습니다.

 env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi '' '' -thread_queue_size 4096 -framerate 30 -f x11grab -s 1366x768 -i :0.0 -acodec libfdk_aac -b:a 192k -vf format=nv12,hwupload -vcodec h264_vaapi -f flv TEST002.flv

옵션이 있을 때 사용해야 하는 따옴표가 있지만 비어 있으므로 명령이 실패합니다.

다른 접근 방식을 시도하는 경우 변수 부분을 다음과 같이 변경합니다(따옴표 제외).

${monitorsom} ${openal} ${micro} ${microal} ${complexo}   \

비어 있으면 작동하지만 공백으로 인해 옵션이 있으면 실패합니다. 필요한 따옴표를 사용하여 변수를 전달하기 위해 다음을 시도했습니다.

openal=' "Monitor of Áudio interno Estéreo analógico" '

변수 값 사이에 작은따옴표를 추가하면 다음과 같은 결과가 발생합니다.

'"Monitor' of Áudio interno Estéreo 'analógico"'

결과적으로는 실패했습니다.

사용하려고 하면:

openal="  'Monitor of Áudio interno Estéreo analógico' " 

결과는 다음과 같습니다

''\''Monitor' of Áudio interno Estéreo 'analógico'\'''

실패하다.

필요한 따옴표를 사용하여 변수를 전달하는 방법이 있습니까? 나는 통과하고 싶다:

"Monitor of Áudio interno Estéreo analógico"

또는

'Monitor of Áudio interno Estéreo analógico'

하지만 따옴표 없이 값도 허용해야 합니다. 그러므로 필요한 경우에는 따옴표를 사용하여 변수 값을 설정할 수 있어야 하고, 필요하지 않거나 오류가 발생하는 경우에는 따옴표를 사용하지 않고 설정할 수 있어야 한다고 생각합니다.

감사해요.

답변1

빈 인수로 인해 문제가 발생하는 경우 빈 변수를 필터링할 수 있도록 배열을 사용하여 명령줄을 작성하는 것이 좋습니다.

opts=()
add_opt() {
    for i; do [[ -n "$i" ]] && ops+=("$i"); done
}
add_opt "${monitorsom}" "${openal}" "${micro}" "${microal}" "${complexo}"

그 다음에:

env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough \
-vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi \
"${opts[@]}"   \
-thread_queue_size 4096 -framerate 30  \
-f x11grab -s "$(xdpyinfo  | grep -oP 'dimensions:\s+\K\S+')" -i :0.0  \
-acodec libfdk_aac -b:a 192k \
-vf 'format=nv12,hwupload' -vcodec h264_vaapi \
-f flv "${nome}"

an이 opts비어 있으면 "${opts[@]}"비어 있는 상태로 확장되고 빈 변수는 필터링됩니다.

(계속해서 각 옵션을 배열에 넣습니다. 명령줄이 길면 다음과 같이 하는 경향이 있습니다.

opts=(
"opt1"
"opt2"
...
)
cmd "${opts[@]}"

이렇게 하면 옵션을 더 쉽게 추적할 수 있습니다. )

관련 정보