Hi Eli How about using the shell itself to parse the output of "typeset" (an alias for "declare"), but redefining "declare" to do something different. This is a bit verbose but it works cleanly:
``` ( function declare { while [[ $1 = -* ]] ; do shift ; done printf %s\\n "${@%%=*}" } eval "$( typeset -p )" ) ``` or ``` ( declare -a var_names=() function declare { local v for v do [[ $v = -* ]] || var_names+=("${v%%=*}") done } eval "$( typeset -p )" unset -f declare do_something_with "${var_names[@]}" ) ``` -- -Martin On Mon, 26 Jun 2023 at 04:38, Eli Schwartz <eschwart...@gmail.com> wrote: > compgen is a useful builtin for inspecting information about the shell > context e.g. in scripts -- a good example of this is compgen -A function > or compgen -A variable. > > But it's not always available depending on how bash is built, which > results in people lacking confidence that it can / should be used in > scripts. See e.g. https://bugs.gentoo.org/909148 > > Would it be possible to have a slightly more minimal version of it with > readline functionality and "currently inside programmable completions" > functionality stripped out, which just allows it to be used for general > environment introspection? > > An alternative for compgen -A function does exist -- declare -F in > combination with e.g. sed. Variables is harder since AFAICT the only way > to print all of them prints multiline values too (declare -p is similar > to declare -f, there is no declare -P similar to declare -F, using > ${!a@} to expand variable names does not work generically enough since > you need to specify a prefix -- ${!@} won't expand all of them). > > > -- > Eli Schwartz > >