nixCraft Poll

Topics

Bash Shell Completing File, User and Host Names Automatically

Posted by Vivek Gite [Last updated: November 14, 2007]

Bash can auto complete your filenames and command name. It can also auto complete lots of other stuff such as:
=> Usernames

=> Hostname

=> Variable names

=> Fine tuning files and names with ESC keys

Match variable

If the text begins with $, bash will look for a variable. For example, open terminal and type echo $T and press TAB key, shell will complete that to echo $TERM:
echo $T {hit-tab-key}

Match Username

If the test begins with ~ (tilde), bash will look for a user name. For example, open terminal and type cat ~g and press TAB key, shell will complete that to cat ~guess/file.txt:
cat ~g {hit-tab-key}

Match hostname

If the test begins with @, bash will look for a host name. For example, open terminal and type scp file.txt tom@o and press TAB key, shell will complete that to scp file.txt tom@oldbox:
scp file.txt tom@o {hit-tab-key}
Please note that you need proper host resoultion configured to work with this hack via NIS or hosts file. Also after shell completes the command name / username or filename hit the [ENTER] key.

Fine tunning Shell Completing stuff with ESC key

Bash allows you to fine tune file completion using ESC key combinations. People get amazed when I use ESC combination in front of them. For example, to inserts all possible completions into your command use ESC+*. Let us see how to backup all /etc/*.conf files, type the command:
tar -zcvf /dev/rt0 /etc/*.conf {hit ESC followed by *}
As soon as you hit Esc+*, shell replaces the /etc/*.conf part with names of all matching wild card patterns
tar -zcvf /dev/rt0 /etc/aatv.conf /etc/adduser.conf /etc/apg.conf /etc/brltty.conf /etc/ca-certificates.conf /etc/cvs-cron.conf /etc/cvs-pserver.conf /etc/debconf.conf ....

To displays all possible completions of command or filenames or username type ESC+?, to display all username start with the word le, type
cat ~le {hit ESC followed by ?}

complete command

There is also in built command called complete. It is used to specify how arguments are to be completed for a command. For example, when you type passwd (or any other user admin command such as su / usermod etc) and hit tab key, bash will show you a list of all available users i.e. all user admin related commands will see only user names:
complete -u su usermod userdel passwd chage write chfn groups slay w
Now type passwd and hit tab key to see all username:
passwd {hit tab key}
Output:

avahi          bin            dhcp           gdm            haldaemon      klog           mail           news           root           sys            uucp
avahi-autoipd  cupsys         dnsmasq        gnats          hplip          list           man            nobody         sshd           syslog         vivek
backup         daemon         games          guest          irc            lp             messagebus     proxy          sync           telnetd        www-data
vivek@vivek-desktop:/tmp$ passwd 

Cool, huh? There is a nice file included with almost all distro to complete lots of stuff using complete command. Just add following line to your bash startup file:
source /etc/bash_completion

Further reading:

Want to stay up to date with the latest Linux tips, news and announcements? Subscribe to our free e-mail newsletter or RSS feed to get all updates. You can Email this page to a friend.

You may also be interested in other helpful articles:

Discussion on This Article:

  1. Scott Carlson Says:

    The example:
    tar -zcvf /dev/rt0 /etc/*.conf {hit ESC followed by *}

    Didn’t work on Ubuntu but did on FC4. Any ideas why?

  2. Scott Carlson Says:

    Got it. You must have “set -o vi” by default. Ubuntu is “set -o emacs” by default.

  3. vivek Says:

    Scott,

    It should work on Ubuntu and yes SHELLOPTS is set to emacs for me. I’m using bash 3.x

  4. yj Says:

    cat ~le {hit ESC followed by ?}

    hit tab key twice work same.

  5. yoooo Says:

    so where do we put: source /etc/bash_completion ?

  6. vivek Says:

    @yoooo,

    /home/you/.bashrc or /home/you/.bash_profile

Leave a Reply

We encourage your comments, and suggestions. But please stay on topic, be polite, and avoid spam. Thank you very much for stopping by our site!

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

Tags: , , , , , , ,

Copyright © 2004-2008 nixCraft. All rights reserved - TOS/Disclaimer - Privacy policy - Sitemap - Powered by Open source software.