10

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
  • 1
    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 03 '16 at 06:28
  • Near-duplicate of http://unix.stackexchange.com/q/94775/135943 (I've linked in both directions.) – Wildcard Apr 03 '16 at 06:31

5 Answers5

7

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
Lri
  • 5,223
3

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. – Gilles 'SO- stop being evil' Jan 30 '13 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) – Forever Learner Feb 01 '13 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. – Stéphane Chazelas Feb 01 '13 at 21:58
  • In bash: just typing complete -A keyword is enough. Don't know the exact version which added this capacity. –  Jan 11 '19 at 08:54
3

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

l0b0
  • 51,350
1

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

Renan
  • 17,136
0

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).