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.