How BASH Shell Command Search Sequence Works

by on February 11, 2006 · 12 comments· LAST UPDATED August 29, 2007

in , ,

This article was organically contributed by monk.

HASH tables and PATH is not the first method locating your program / executable files. Your program can be a shell function or builtin command or an alias. Here is the complete sequence adopted by BASH shell to execute your command:

  1. Before a command is executed REDIRECTION is done. Then following sequence used by SHELL
  2. ALIASES
  3. Parameter expansion, command substitution, arithmetic expansion, and quote removal before being assigned to the variable
  4. Shell FUNCTION
  5. BUILTIN command
  6. HASH tables
  7. PATH variable
  8. If everything fails, you see command not found error message.

Examples

Try out following simple example to clear your idea about SHELL sequence

a) Create your own bin directory and add to a PATH:
$ mkdir ~/bin
$ export PATH=$PATH:~/bin

b) Create function called hello:
$ function hello() { echo "Hello from function()" ; }

c) Create alias called hello:
$ alias hello='echo Hello from alias'

d) Create script called hello in /home/you/bin directory (which is added to your PATH)
$ echo 'echo Hello from script' > ~/bin/hello
$ chmod +x ~/bin/hello

e) Test it...
Now you have three different commands with same name (i.e. hello). Which one will execute first? Type hello command and find out if above sequences works or not:
$ type hello
$ hello

Output:

Hello from alias

f) Remove alias and run hello again:
$ unalias hello
$ hello

Output:

Hello from function()

g) Remove function hello and run hello again:
$ unset hello
Output:

Hello for script

h) Remove script hello and run hello again:
$ rm ~/bin/hello
$ hello

Output:

bash: /home/monk/bin/hello: No such file or directory

You just removed the hello script but Bash shell still looking hello program at /home/monk/bin/hello location. What is going on here?
Answer is pretty simple - HASH table. (shell is looking for a cached PATH entry for hello script). To verify this just type hash command to see HASH table:
$ hash
Output:

hits    command
1    /bin/rm
1    /bin/cat
2    /usr/bin/print
3    /home/monk/bin/hello
1    /usr/bin/man

Your SHELL remembered path settings name in HASH table. There is an easy solution, just clear hash table and see the effect again:
$ hash -r
$ hello
Output:

bash: hello: command not found

I hope this basic explanation will help to all newbie(s) out there. As a result next time you run a command remember shell goes through quite a complicated sequence of operations to process your request.

Continue reading the second part of "How Linux or UNIX Understand which program to run" series (this is part I).

  • PART I : How Linux or UNIX Understand which program to run
  • PART II : An example: How shell Understand which program to run

Updated for accuracy.

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 12 comments… read them below or add one }

1 Vurdlak February 11, 2006 at 8:25 pm

this is great stuff can i get permission to publish it on my c++ maniac blog?? i’ll inlude your link!

Reply

2 Hatim February 12, 2006 at 8:29 pm

Neat

Reply

3 Anonymous February 12, 2006 at 11:37 pm

great stuff but why cant u explain other topic also like “PAM” “CRON” ?
PRASHANT K

Reply

4 jmarki February 13, 2006 at 1:05 am

Is this only for the bash shell or for most of the common shells being used (tcsh, sh)?

Reply

5 Anonymous February 13, 2006 at 1:21 am

Built-in command –> external commands.

I think the author used bash shell as an example here, so it is BASH specific stuff.

Best Regards,

Mike

Reply

6 Anonymous February 19, 2006 at 11:52 am

The description while simple, is acturate enough for most modern shells (zsh, bash, *ksh, *csh)

Regards,

Pete

PS: Aliases, Functions and Builtins have to be above external commands in the search order as the shell can not be customised internally if external commands are given priority. Consider, alias ls=’ls -aF’ as an example, this allow a user to essentially customise there POSIX Environment (Standardised UNIX Like Environment — Linux is a KERNEL, not an operating system) without the need for external commands.

Reply

7 sathiya June 4, 2006 at 4:17 pm


simply superb

Reply

8 Diptanjan June 12, 2007 at 1:24 pm

Simple and to the point.

Reply

9 Philippe April 24, 2009 at 1:54 pm

Very interesting and informative. Thank you for taking the time to post this.

Reply

10 Nizzy October 29, 2009 at 9:00 pm

somehow the word function does not execute.

which is correct?
function func_name() {
}
or
func_name() {
}
or
function func_name {
}

if put the plain test into hello file, then command hello prints. but if I make it a function, it returns nothing, but does not give error.

please help

Reply

11 Nizzy October 29, 2009 at 9:55 pm

I finally executed the function, however, it will not execute in the next login even if I have the path in the PATH.

if I source the func_file, then I can execute, but then I have to source each time..why?

Reply

12 Anoop July 15, 2011 at 6:02 pm

Thank you! I found the hash -r part very useful!

Reply

Leave a Comment

Tagged as: , , , , , , , , , ,

Previous post:

Next post: