Ищу (желательно "all-zsh") альтернативу printenv, которая может обрабатывать Unicode в именах переменных

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 и т.д.). Результат очень похож на то, как реальный вывод выглядит на моем экране.

-1
19.01.2016, 02:55
2 ответа

Ну, конечно, просто используйте экспорт (работает в любой оболочке в стиле Борна) или 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
28.01.2020, 05:08

Возможно, его нет, потому что это было бы не-POSIX.

Дальнейшее чтение:

Конечно, zsh может реализовать расширение, но если другие приложения не могут читать переменные, они имеют ограниченное применение.

Переменные оболочки и переменные среды отличаются тем, что переменные оболочки могут храниться в памяти интерпретатора оболочки (и они ограничены только самим интерпретатором оболочки), в то время как переменные среды экспортируются - становятся доступными для использования другими программами. Именно поэтому в игру вступают стандарты (такие как POSIX).

1
28.01.2020, 05:08

Теги

Похожие вопросы