Плохая ошибка замены в оболочке zsh

Что точно Вы называете входом/в? Если Вы выходите из сессии в который ssh-agent работал, затем ssh-agent Вы говорили, позже был другой, чем тот, который Вы загрузили ключи в - настольный менеджер сеансов завершает все рабочие пользовательские сервисы (включая ssh и gpg агенты) в конце сессии.

Вы могли бездельничать он путем порождения агента независимо от какой-либо сессии и затем введения корректных переменных среды в среду сессии - просто необходимо ли найти из того, где делает менеджера по оформлению, ищет пользовательскую среду.

4
13.04.2017, 15:37
3 ответа

zsh имеет подстановку параметров, отличную от Бэша, что документировано в man zshexpn. Она поддерживает различные модификаторы поведение расширения, которые заключены в круглые скобки перед именем переменной: ${(X)name}. Модификатором для включения ключей массивов (в том числе и для ассоциативных массивов) является k: ${(k)array} расширяется до списка ключей в массиве, за исключением того, что если ключом является пустая строка, она опускается. Для сохранения пустого ключа используйте двойные кавычки и модификатор @. Цикл

for x in "${(@k)array}" ; ...

будет перебирать ключи массива @.

7
27.01.2020, 20:46

Вы должны использовать "${(@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}"
4
27.01.2020, 20:46

AFAIK, ${!...} не существует. Полагаю, ты хочешь: ${(k)array[@]}, или просто ${(k)array}. Для получения дополнительной информации смотрите man-страницу zshexpn(1), на которой написано для флага расширения k: "Если имя относится к ассоциативному массиву, подставьте ключи (имена элементов), а не значения элементов"

.
2
27.01.2020, 20:46

Теги

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