Что точно Вы называете входом/в? Если Вы выходите из сессии в который ssh-agent
работал, затем ssh-agent
Вы говорили, позже был другой, чем тот, который Вы загрузили ключи в - настольный менеджер сеансов завершает все рабочие пользовательские сервисы (включая ssh и gpg агенты) в конце сессии.
Вы могли бездельничать он путем порождения агента независимо от какой-либо сессии и затем введения корректных переменных среды в среду сессии - просто необходимо ли найти из того, где делает менеджера по оформлению, ищет пользовательскую среду.
zsh
имеет подстановку параметров, отличную от Бэша, что документировано в man zshexpn
. Она поддерживает различные модификаторы поведение расширения, которые заключены в круглые скобки перед именем переменной: ${(X)name}
. Модификатором для включения ключей массивов (в том числе и для ассоциативных массивов) является k
: ${(k)array}
расширяется до списка ключей в массиве, за исключением того, что если ключом является пустая строка, она опускается. Для сохранения пустого ключа используйте двойные кавычки и модификатор @
. Цикл
for x in "${(@k)array}" ; ...
будет перебирать ключи массива @
.
Вы должны использовать "${(@k)array}"
, "${(k)array}"
только для расширения до непустых ключей:
typeset -A array
array=(k1 v1 k2 v2 k3 v3)
for k in "${(@k)array}"; do
printf "%s -> %s\n" "$k" "$array[$k]"
done
Then:
$ zsh test.zsh
k1 -> v1
k2 -> v2
k3 -> v3
Также можно заменить для
цикла на ключ, расширение значения:
printf '%s -> %s\n' "${(@kv)array}"
AFAIK, ${!...}
не существует. Полагаю, ты хочешь: ${(k)array[@]}
, или просто ${(k)array}
. Для получения дополнительной информации смотрите man-страницу zshexpn(1)
, на которой написано для флага расширения k
: "Если имя относится к ассоциативному массиву, подставьте ключи (имена элементов), а не значения элементов"