Bash Shell Completing File, User and Host Names Automatically
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:
- Bash man page and complete command section
- /etc/bash_completion file
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:
- Linux bash shell command shortcuts and tips
- nixCraft FAQ Roundup
- Tutorial: Working with UNIX and Linux Shell
- Upgrade wordpress quickly in 3 easy steps from UNIX shell prompt
- nixCraft FAQ Roundup ~ Aug, 16, 2007
Discussion on This Article:
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!
Tags: /etc/bash_completion file, auto complete, complete_command, completions, filenames, hostname, shell, tab key



The example:
tar -zcvf /dev/rt0 /etc/*.conf {hit ESC followed by *}
Didn’t work on Ubuntu but did on FC4. Any ideas why?
Got it. You must have “set -o vi” by default. Ubuntu is “set -o emacs” by default.
Scott,
It should work on Ubuntu and yes SHELLOPTS is set to emacs for me. I’m using bash 3.x
cat ~le {hit ESC followed by ?}
hit tab key twice work same.
so where do we put: source /etc/bash_completion ?
@yoooo,
/home/you/.bashrc or /home/you/.bash_profile