zsh
поддерживает имена переменных с символами Unicode (если установлена опция multibyte
), но printenv
(по крайней мере, версия 8.23 GNU), похоже, не может обрабатывать такие имена переменных.
Например,
% 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
и т.д.). Результат очень похож на то, как реальный вывод выглядит на моем экране.
Ну, конечно, просто используйте экспорт
(работает в любой оболочке в стиле Борна) или 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
}
Возможно, его нет, потому что это было бы не-POSIX.
Дальнейшее чтение:
Конечно, zsh
может реализовать расширение, но если другие приложения не могут читать переменные, они имеют ограниченное применение.
Переменные оболочки и переменные среды отличаются тем, что переменные оболочки могут храниться в памяти интерпретатора оболочки (и они ограничены только самим интерпретатором оболочки), в то время как переменные среды экспортируются - становятся доступными для использования другими программами. Именно поэтому в игру вступают стандарты (такие как POSIX).