## 3.19. Making a "Login" Shell

When you log in to most Unix systems, your shell is a login shell. When a shell is a login shell, it acts differently (Section 3.4).

Sometimes, when you're testing an account or using a window system, you want to start a login shell without logging in. Unix shells act like login shells when they are executed with a name that starts with a dash (`-`).[11] This is easy to do if you're using a system call in the exec(3) family. These system calls let a C-language programmer give both the filename of an executable file, like sh or /bin/sh, as well as the name that should be used to identify the process (in a ps (Section 24.5) listing, for example), like -sh.

> [11]bash also has a command-line option, -login, that makes it act like a login shell. zsh -l (lowercase L) does the same for zsh.

If you're currently using zsh, you can invoke another shell this way by typing a dash and a space before the shell's name:

>     zsh% - csh
>        ...C shell starts, acting like a login shell...
>     %

C programmers can write a little program that runs the actual shell but tells the shell that its name starts with a dash. This is how the Unix login process does it:

>     run_login_csh( )
>     {
>         execl("/bin/csh", "-csh", 0);
>     }

A more general solution is to make a link (Section 10.4) to the shell and give the link a filename starting with a dash. If your own bin subdirectory is on the same filesystem as /bin (or wherever the executable shell file is), you can use a hard link. Otherwise, make a symbolic link, as shown here:

`bin` Section 7.4, `./-` Section 14.13

>     $ cd $HOME/bin
>     $ ln -s /bin/csh ./-csh

Then you can execute your new shell by typing its name:

>     $ -csh
>        ...normal C shell login process...
>     % ...run whatever commands you want...
>     % logout
>     $ ...back to original shell

--JP and SJC

Copyright © 2003 O'Reilly & Associates. All rights reserved.