배열 형태로 주어진 명령을 문자열화하고 싶습니다.
예를 들어, 이는 명령을 에 넣을 때 유용합니다 bash -c
.
예를 들어:
cmd=(
"printf '%s\n'"
"foo bar"
"baz bang"
)
stringified="$(transform "${cmd[@]}")"
이렇게 하면 "${cmd[@]}"
모든 bash -c "$stringified"
cmd 배열에 대해 정확히 동일한 출력을 제공합니다.
내 경우에는 다음과 같습니다.
$ "${cmd[@]}"
foo bar
baz bang
제 경우에는 값이 stringified="printf \"%s\n\" \"foo bar\" \"baz bang\""
작동하지만 이러한 매개변수를 적절하게 이스케이프 처리할 수 있는 변환 함수가 있으면 좋겠습니다.
저는 bash 솔루션을 선호하고, 그렇지 않은 경우 일반적으로 Linux 배포판에 이미 설치되어 있는 도구(printf, echo)를 사용하는 것을 선호합니다.
답변1
해당 기능을 사용하는 좋은 솔루션(모든 입력 배열에 대해 작동한다고 생각함)을 찾았습니다 printf "%q"
.
다음과 같이 작성할 수 있습니다.
cmd=(
"printf '%s\n'"
"foo bar"
"baz bang"
)
stringified="$(printf "%q " "${cmd[@]}")"
이는 다음을 제공합니다:
printf\ \'%s\\n\' foo\ bar baz\ bang
설명하다
printf "%q" 명령은 셸에서 사용하기 위해 문자를 이스케이프합니다.
%q 인수 인쇄할 수 없는 문자를 이스케이프하기 위해 권장되는 POSIX $'' 구문을 사용하여 쉘 입력으로 재사용할 수 있는 형식으로 인쇄합니다.
출처: man printf
을 사용하면 "%q "
배열의 모든 요소가 올바르게 인쇄되고 이스케이프되며 뒤에 공백이 있으므로 %q
모든 요소가 공백으로 구분됩니다.