2008-08-15
Using a non-standard shell as your login shell
Suppose that you want to use a non-standard shell as your login shell (for the purposes of this, 'non-standard' means that it's not installed system-wide; you have to compile your own version). Further suppose, for the sake of argument, that the shell you want to use doesn't have a command-line option to tell it to be a login shell.
If your shell did have such a command line option, using it as your
login shell would be simple. Set your system shell to /bin/sh
and
then have a .profile
that just said something like:
SHELL=$HOME/bin/shell; export SHELL exec $SHELL --login
(This doesn't work on some systems in some circumstances, but that's another entry entirely.)
Without such an option, you need some way to make your non-standard
shell think that it is being run as a login shell by login
(and things
that imitate it, like your SSH daemon). As you might guess, there is a
long-standing convention for how login
communicates this to the shell:
a login shell has a '-
' as the first character of its program name.
(This works because the entire argument list, including the program name (aka 'argument zero'), is entirely up to the program that runs you; it need not have anything to do with your actual file name.)
This really means the first character, which means that you need some
way to make the first character be a '-
'. As it happens, most or all
shells just use the bare program name if you run something that is found
in your $PATH
. So what you need is two-fold: first, you need a version
of your shell that's called '-shell
' (easily gotten with a symlink or
a hardlink), and second, you need to add $HOME/bin
to your $PATH
so
you can run your shell without an absolute or relative path.
This gives you the magic incantation:
SHELL=$HOME/bin/shell PATH=$HOME/bin:$PATH export SHELL PATH exec -shell
(Then you run into a bash irritation.)