== 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 BashExecAnnoyance]].)