Список имен псевдонимов, функций и переменных в zsh

11

Мне нужен способ перечислить имена (без тела / содержимого / значения) псевдонимов, функций, переменных, массивов в Zsh. Оптимально он должен вести себя так compgen:

compgen -a # will list all the aliases you could run.
compgen -A function # will list all the functions you could run.
compgen -A variable # will list all the variables defined.

Задний план

Мне нужно это для разработки env_parallel.zsh: https://www.gnu.org/software/parallel/env_parallel.html

Оле Танге
источник

Ответы:

18

Псевдонимы и функции содержатся в aliasesи functions, и нужно просто напечатать ключи таких. «Переменные и массивы» хитрее; parametersможет хватить?

print -rl -- ${(k)aliases} ${(k)functions} ${(k)parameters}

(Вам также может понадобиться builtins, commandsи, возможно, другие вещи, перечисленные print -l ${(k)и затем смешанные tab, при условии, что завершение включено.)

thrig
источник
1
Может быть ${(kM)parameters:#[[:alpha:]_][[:alnum:]_]#}extendedglob) только для параметров, которые являются переменными.
Стефан
for k in ${(koM)parameters:#[[:alpha:]][[:alnum:]_]#}; do; [[ ${(M)parameters[$k]:#association*} ]] || continue; print -- "$k"; done( extendedglobдолжен быть установлен) должен дать вам краткий список переменных для использования в зависимости от того, какие данные вы ищете. Изменение [[:alpha:]]к [[:alpha:]_]будет включать в себя ассоциативные массивы (или переменные) , которые начинаются с символа подчеркивания. Изменение association*на scalar*или array*или integer*или *export*даст вам результаты этих типов. «Переменные и массивы» требуют немного больше работы.
Friartek