escape
저는 다음과 같이 동작하는 함수를 작성하려고 합니다. 호출하겠습니다.
% IFS=$' \t\n\000'
% escape FOO $IFS
FOO=$' \t\n\000'
즉, escape
두 개의 매개변수를 취한 다음 첫 번째 매개변수를 변수 이름으로 사용하면 zsh 라인이 인쇄됩니다.소스 코드여기서 해당 이름의 변수에는 따옴표 $''
로 묶인 "표준 print
이스케이프" 문자열이 할당되어 이 소스 코드 줄이 평가될 때 첫 번째 인수로 명명된 변수는 두 번째 인수를 값으로 갖게 됩니다. (나는 이것이 진흙처럼 명확하다고 확신하므로 escape
이 게시물의 끝에서 어떻게 작동해야 하는지에 대한 더 많은 예를 제공하겠습니다.)
다음은 함수의 불완전한 구현입니다 escape
.
escape () {
local varname=$1
local value="$2"
print -n "$varname=\$'"
# ???
print "'"
}
누락된 부분( 으로 표시 ???
)은 콘텐츠가 $value
"정규적으로 print
이스케이프된" 부분입니다. print
식별할 수 있는 표현이 최소한 여러 개 있는 문자가 많기 때문에 "정규" 한정자가 필요합니다 . 예를 들어, as 및 as 도 print
알려져 있습니다 . 이 경우 표준 형식입니다. 일반적으로 표준 이스케이프 시퀀스 , 등 은 해당 문자의 표준 형식입니다. 인쇄 가능한 ASCII 문자(예 : , ) 의 표준 표시 형식이 표준화되었습니다. 나머지 문자에 대해 표현 선택이 주어지면 표준 형식으로 8진수 형식을 선택하지만(적어도 까지 ; 더 높은 코드를 처리하는 방법을 잘 모르겠습니다 ) 그 선호도는 강력하지 않습니다.\n
\012
\C-J
\n
\n
\r
\t
A
=
9
\177
$''
물론, 나는 이 기능을 "처음부터" 구현하는 코드를 보고 싶지 않습니다. 대신, print
바이트를 이스케이프된 텍스트 표현으로 변환 하는 유틸리티가 이미 존재했으면 좋겠습니다 .
어떤 조언이라도 대단히 감사하겠습니다!
escape
다음은 몇 가지 실제 예 입니다 (가설).
% escape HELLO $( echo 'hello world' )
HELLO=$'hello world\n'
% escape SUBSEP $( perl -e 'print $;' )
SUBSEP=$'\034'
% abc=$'\141\012\142\012\143\012'
% print -n $abc
a
b
c
% escape ABC $abc
ABC=$'a\nb\nc\n'
답변1
제 생각에는q
매개변수 확장 플래그, 특히 qqqq
변형.
FOO=${(qqqq)IFS}
따라서 다음과 같은 함수를 작성할 수 있습니다(플래그를 사용하여 P
이름이 지정된 매개변수 확장 $2
).
escape () {
print -r -- "$1=${(Pqqqq)2}"
}