変数名でUnicodeを処理できるprintenv(好ましくは「all-zsh」)の代わりを探しています。

変数名でUnicodeを処理できるprintenv(好ましくは「all-zsh」)の代わりを探しています。

zshUnicode文字を含む変数名はサポートされていますが(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

変数名でUnicodeを処理できる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など)が適用される理由です。

関連情報