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 (-
).[8] 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.
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
[8] 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.