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)发挥作用的原因。