The exec builtin calls the underlying exec(3) system call. It has two main purposes. The first is the way in which the system call is most commonly used — to replace the currently running process with a different process. That is, the shell itself will be replaced by a different program, be it another shell, or any other program. When the exec’d program terminates, control is not returned to the calling shell. The second use is to cause redirection to happen as a byproduct of the exec call.
Using exec to Replace the Existing Program
A typical login session is shown in the following example, when the user logs in to node2 from node1. The hostnames are reflected in the shell prompts, and the % prompt reflects a csh session, while the $ prompt reflects a bash session.
↓THE USER LOGS IN TO NODE2 FROM NODE1, AND IS GREETED WITH A CSH PROMPT.
steve@node1:~$ ssh node2 steve@node2's password: You have new mail. Last login: Mon Jan 17 15:19:53 2011 steve@node2%
↓PREFERRING BASH, THE USER THEN CALLS BASH FROM THE CSH PROMPT.
↓THE USER THEN DOES WHATEVER IS WANTED IN THE BASH SHELL.
steve@node2:~$ # do stuff in bash steve@node2:~$ echo $SHELL /bin/bash
↓ON COMPLETING THE TASKS, THE USER EXITS THE SHELL. INSTEAD OF CLOSING THE CONNECTION, THE USER SIMPLY DROPS BACK TO THE CALLING CSH SESSION; TO CSH, BASH WAS JUST ANOTHER PROGRAM, WHICH RAN AND HAS NOW COMPLETED EXECUTION.
steve@node2:~$ exit exit steve@node2%
↓THE USER EXITS THE CSH SESSION AND FINALLY ...