19

When I press tab in a console I get this output

Display all 2957 possibilities? (y or n)

Is there any way to use grep on these 2957 possibilities? I would like to search for all commands with the word "svn" in them.

6 Answers 6

22

The solution is the bash builtin compgen. To grep 'svn' from all available commands and command aliases accessible through $PATH, type.

compgen -ac | grep svn

Want to search from a certain prefix (eg all commands that start with ecrypt)? Use regular expressions..

compgen -ac | grep "^ecrypt"
1
  • excellent answer, but what if one wants to grep tab completion possibilities themselves? I mean, it's not always triggered by the command name, but also by command parameters, etc.
    – UncleZeiv
    Jan 3, 2012 at 14:08
2

You can try using compgen.

For example:

compgen -ac | grep "svn"
1

This should be equivallent:

for x in `echo $PATH | sed 's/:/ /g'`; do ls $x | grep svn; done
1
for i in $(echo $PATH | tr ":" "\n"); do find $i -type f -perm +111; done | grep svn

Very similar to totaam's answer apart from this limits its scope to executables (as Bash does). But JJE's compgen is another mile better.

1

maybe {,.}*svn* helps here, e.g. ls -l /usr/bin/{,.}*svn*<tab>.

But, have a look on the Zsh! Here: http://www.jukie.net/bart/blog/zsh-tab-completion are some great examples how it can help to reduce your tab completion results. This includes also negation, e.g. if you want all tab-completion results without the word "foobar", or all results with even digits in the first place, subdirectory tab-completion and much more. The reason why I changed to zsh was history sharing between all open terminals.

0

I didn't knew compgen, and would have suggested:

ls -d ${PATH//:/\/*svn* } 2>/dev/null

for bash.

${VAR//pattern/replace} replaces in VAR pattern with replace. // is used to replace every pattern, not just the first, which would be just /.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .