Ассоциативный массив zsh: `Declare -p` не печатает значения - PullRequest
0 голосов
/ 29 сентября 2018

run-help typeset говорит:

  -p [ n ]                                                                                                                                                                                                    
          If  the  -p  option  is  given, parameters and values are                                                                                                                                            
          printed in the form of a typeset command with an  assign-                                                                                                                                            
          ment,  regardless  of other flags and options.  Note that                                                                                                                                            
          the -H flag on parameters is respected; no value will  be                                                                                                                                            
          shown for these parameters.                           

Обратите внимание, что это говорит parameters and values выше.

Если это так:

% typeset -p ZPLGM 
typeset -A ZPLGM

Обратите внимание, что никаких ключевых значений выше, однако они существуют:

% echo $ZPLGM[PLUGINS_DIR]
/home/ravi/.config/zsh/.zplugin/plugins
  1. Почему typeset -p не работает так, как я ожидаю?
  2. Как мне получить typeset длявывести оператор, который при выполнении воссоздает массив?

1 Ответ

0 голосов
/ 01 октября 2018

Поскольку переменная ZPLGM определена с опцией -H.

unset foo
typeset -AH foo=([bar]=123)
#         ^----here
echo $foo[bar]
typeset -p foo
123
typeset -A foo

typeset имеет опцию -H, как объясняется в руководстве:

  -H     Hide  value:  specifies that typeset will not display the
         value of the parameter when listing parameters; the  dis-
         play for such parameters is always as if the `+' flag had
         been given.  Use of the parameter is  in  other  respects
         normal, and the option does not apply if the parameter is
         specified by name, or by  pattern  with  the  -m  option.
         This   is  on  by  default  for  the  parameters  in  the
         zsh/parameter and zsh/mapfile  modules.   Note,  however,
         that  unlike the -h flag this is also useful for non-spe-
         cial parameters.
unset foo
typeset -A foo=([bar]=123)
echo $foo[bar]
typeset -p foo
123
typeset -A foo=( [bar]=123 )
...