寻找 printenv 的替代方案(最好是“all-zsh”),可以处理变量名称中的 Unicode

寻找 printenv 的替代方案(最好是“all-zsh”),可以处理变量名称中的 Unicode

zsh支持带有 Unicode 字符的变量名(如果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 的替代方案能够处理变量名称中的 Unicode? (出于可移植性的原因,“all-zsh”解决方案会更可取。)


1完全披露:当我将屏幕的输出粘贴printenv | grep BANANAS到 StackExchange 编辑器中时,一些字符被自动删除。我已经用指定八进制代码的字符串“模拟”了这些被剥离的字符(例如\203\260等)。结果与屏幕上的实际输出非常相似。

答案1

呃,当然,只需使用export(适用于任何 Bourne 风格的 shell)、或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可以实施扩大,但除非其他应用程序可以读取这些变量,否则它们的用途有限。

shell 变量和环境变量是不同的,因为 shell 变量可以存储在 shell 解释器的内存中(它们仅受 shell 解释器本身的限制),而环境变量是导出的——可供其他程序使用。这就是标准(例如 POSIX)发挥作用的原因。

相关内容