변수 이름에서 유니코드를 처리할 수 있는 printenv(바람직하게는 "all-zsh")에 대한 대안을 찾고 있습니다.

변수 이름에서 유니코드를 처리할 수 있는 printenv(바람직하게는 "all-zsh")에 대한 대안을 찾고 있습니다.

zsh유니코드 문자가 포함된 변수 이름은 지원되지만( multibyte이 옵션이 설정된 경우) printenv(최소 GNU 버전 8.23 ​​​​)에서는 이러한 변수 이름을 처리할 수 없는 것 같습니다.

예를 들어,

% export BANANAS=バナナス
% export バナナス=BANANAS
% /bin/echo -e "$BANANAS\n$バナナス"
バナナス
BANANAS

...하지만 1

% printenv | grep BANANAS
BANANAS=バナナス
ャ\203\260ャ\203\252ャ\203\252ス=BANANAS
% printenv --version | head -1
printenv (GNU coreutils) 8.23

변수 이름에서 유니코드를 처리할 수 있는 printenv의 대안이 있습니까? (이식성 이유로 "all-zsh" 솔루션이 더 좋습니다.)


1 전체 공개: 화면 출력을 printenv | grep BANANASStackExchange 편집기에 붙여넣을 때 일부 문자가 자동으로 제거되었습니다. 나는 8진수 코드(예: \203\260등) 를 지정하는 문자열을 사용하여 이러한 제거된 문자를 "시뮬레이트"했습니다 . 결과는 화면의 실제 출력과 매우 유사합니다.

답변1

물론 export(Bourne 스타일 쉘에서 작동) 또는 typeset -x다른 변형을 사용하십시오. 특정 변수를 인쇄하려면 를 사용할 수 있습니다 typeset -p VAR1 VAR2 VAR3.

zsh에서 다시 읽을 수 있는 참조 형식의 값을 인쇄합니다. VARIABLE=VALUE값에 특수 문자 만 포함시키려면 다음과 같이 함수를 작성할 수 있습니다.

zprintenv () {
  local __zprintenv_var
  if [[ $# -eq 0 ]]; then set -- $(typeset +mx); fi
  for __zprintenv_var do
    print $__zprintenv_var=${(P)__zprintenv_var}
  done
}

답변2

POSIX가 아니기 때문에 아닐 수도 있습니다.

추가 자료:

물론 zsh구현도 가능합니다확장하다, 그러나 다른 응용 프로그램이 이러한 변수를 읽을 수 없으면 사용이 제한됩니다.

쉘 변수와 환경 변수는 쉘 변수가 쉘 인터프리터의 메모리에 저장될 수 있는 반면(쉘 인터프리터 자체에 의해서만 제한됨) 환경 변수는 내보내져 다른 프로그램에서 사용할 수 있다는 점에서 다릅니다. 이것이 표준(예: POSIX)이 적용되는 이유입니다.

관련 정보