compgen: An Awesome Command To List All Linux Commands

Ever want to list all the Linux commands (including bash shell aliases and functions) you could run on the server / workstation? Look now further. Try compgen command.

compgen is bash built-in command and it will show all available commands, aliases, and functions for you. The syntax is:

ADVERTISEMENTS

compgen option

compgen command examples

To list all the commands available to you, enter:

compgen -c

Sample outputs:

ls
if
then
else
elif
fi
....
mahjongg
sol
gtali
sl-h
gnobots2
gnotravex
iagno
fortune
gnect
gnome-sudoku
LS
glchess
gnuchess
gnuchessx

You can search or count the commands:

compgen -c | grep find
compgen -c | wc -l
echo "$USER user can run $(compgen -c | wc -l) commands on $HOSTNAME."

Sample outputs:

vivek user can run 3436 commands on wks01.

To list all the bash shell aliases available to you, enter:

compgen -a

Sample outputs:

..
...
....
.....
.4
.5
bc
cd..
chgrp
chmod
chown
cp
dnstop
egrep
ethtool
fastping
fgrep
grep
iftop
l.
ll
ln
ls
mcdflush
mcdshow
mcdstats
mount
mv
pscpu
pscpu10
psmem
psmem10
rm
tcpdump
update
updatey
vnstat
wget
which

See 30 awesome handy bash aliases for more information. Other options are as follows:

########################################
# Task: show all the bash built-ins
########################################
compgen -b
########################################
# Task: show all the bash keywords
########################################
compgen -k
########################################
# Task: show all the bash functions
########################################
compgen -A function

Putting it all together:

compgen  -abckA function
 
##  It doesnt get much better than this
compgen  -abckA function | less
compgen  -abckA function | grep -i --color searchStringHere
🐧 Get the latest tutorials on SysAdmin, Linux/Unix, Open Source & DevOps topics via:
CategoryList of Unix and Linux commands
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04

ADVERTISEMENTS
10 comments… add one
  • Curtis Jul 19, 2012 @ 12:31

    Here’s a pointless script! If you have `whatis` enabled, you can run this script to tell you what each command is (when that info is available, of course):

    #!/bin/bash
    
    commands=`compgen -c`
    let count=1
    
    for i in ${commands[@]}
    do
    
            what=`whatis $i`
    
            echo -e "n33[38;5;148m$count. $i: 33[39m"
            echo -e "$what"
    
            ((count++))
    
    
    done
    

    Last edited by Admin: pre tags added.

    • brbsix Feb 21, 2015 @ 13:11

      Curtis, FYI when you used commands=`compgen -c`, it loaded commands with a string (albeit a very long one). So in this instance, you could have used:

      for i in $commands
      

      The ${commands[@]} format is generally reserved for use with arrays. It worked in this instance but is not a good habit. If the output contained spaces the aforementioned would fail. You’d probably want to do this:

      Load output of compgen into an array named commands (the -t options strips trailing newline)

      readarray -t commands < <(compgen -c)
      

      Note the quotes to prevent word splitting. The for loop will then run through ${commands[0]}, ${commands[1]}, ${commands[2]}, etc…

      for i in "${commands[@]}"
      

      In my endless quest for Bash excellence, here is your script cleaned up a bit. It will ignore commands without any whatis output. For commands with multiple whatis entries, it will only display the first. Using $((++count)) allows for increment and output at the same time.

      while IFS= read command; do
          what=$(whatis $command 2>/dev/null | head -n1 | awk -F'- ' '{print $2}')
          [[ -n $what ]] && echo "[$((++count))] $command - $what"
      done < <(compgen -c | sort)
      
  • Rajkumar.M Jul 19, 2012 @ 12:31

    Excellent!!!…..

  • LinuxRawkstar Jul 19, 2012 @ 16:19

    GR8! Hidden gem. Lovin’ it.

  • Rajsekhar G Jul 19, 2012 @ 17:16

    Awesome bozz…… Thnx. :)

  • samspade Jul 20, 2012 @ 0:19

    LOL !

    whatis man
    man whatis

  • Ashok Jul 20, 2012 @ 7:21

    try “man man” :)

  • tintam Jul 22, 2012 @ 14:07

    Or if you’re in a gnu bash shell, pressing tab twice will list all available commands

  • Patrick Jul 25, 2012 @ 12:49

    Awesome!! never heard before! Thanks for the Tip

  • Ramon Nov 18, 2012 @ 4:19

    Thanks for sharing!! This will come in handy for sure.

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre>, <code>...</code> and <kbd>...</kbd> for code samples.