I was discussing with my friend on how the commands are parsed in the shell, and he told me that bash searches the command in following order

  1. List of aliases
  2. List of shell keywords
  3. List of user defined functions
  4. List of shell built in functions
  5. List of directories specified in the PATH variable , from left to right.

I know aliases can be found by issuing the alias command. PATH variable contents can be found using echo $PATH command.

Can you please tell me which commands do I need to use ?

  1. To list all shell keywords
  2. To list all user defined functions
  3. To list of shell built in functions
  • It doesn't answer the "list all" part, but should be noted that for any given command you can use type somecmd or type -a somecmd to see which of the above categories it fits into.
    – Wildcard
    Apr 3, 2016 at 6:28
  • Near-duplicate of unix.stackexchange.com/q/94775/135943 (I've linked in both directions.)
    – Wildcard
    Apr 3, 2016 at 6:31

5 Answers 5


You can also use compgen in bash:

  • compgen -k lists keywords
  • compgen -b or enable lists builtins
  • compgen -A function or declare -F lists functions
  • compgen -a or alias lists aliases
  • compgen -c lists commands
  • compgen -v lists variables
  • compgen -e or export lists exported variables

In Bash:

  1. man bash | grep -10 RESERVED lists reserved words:

    ! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]
  2. declare -F and typeset -F shows function names without their contents.

  3. enable lists builtin shell commands (I don't think these are functions as such).So does man builtins


With zsh:

PATH= type -m '*'

Will tell you all 3.

In bash, to list the keywords, you can do:

complete -A keyword :

and then type : <Tab><Tab>

For builtins, replace keyword with builtin above and for functions, I'll let you guess.

  • In zsh, the list of aliases, functions and builtins is also available as array keys: print -l ${(ko)aliases}, etc. Jan 30, 2013 at 23:11
  • @Stephane Chazelas : Thanks. But when I ran commands complte -A keyword : <tab> <tab> and complte -A builtin : <tab> <tab> , both times it prompted my "Display all 2154 possibilities? (y or n) Feb 1, 2013 at 20:51
  • @CppLearner, that's not what I said. Enter the "complete" command, which redefines the completion for the ":" command, and then type :, space, tab and tab. Feb 1, 2013 at 21:58
  • In bash: just typing complete -A keyword is enough. Don't know the exact version which added this capacity.
    – done
    Jan 11, 2019 at 8:54

The answer for the 2nd question in case of bash or zsh: declare -f.


In bash

  • keywords (reserved words):

    compgen -A keyword       # or:  compgen -k
  • functions (defined at the point of execution):

    compgen -A function      # Only names.
    declare -F               # Only names but prefixed with `declare -f`.

    declare -f # Full function definition.

  • builtins

    compgen -A builtin       # Only names.
    enable                   # Names prefixed with `enable `
    man builtins             # Only if the correct man package is installed.

There are some other keywords for compgen as well: alias, commands, variables, export, etc.

A list of possible compgen -A options may be found by completing:

 compgen -A                  # and press Tab (Maybe twice vary by configuration).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.