The conventional meaning of the
SHELL environment variable is the user's favorite interactive shell. There is no obligation that it has any particular syntax (it doesn't have to be Bourne-like), that it supports any particular command line syntax (such as
-c), or that it has anything to do with the login shell (applications that use
SHELL typically default to the login shell if
SHELL is unsed). It's mostly used by terminal emulators as the program to run by default.
If you log in in text mode (on a text console or over SSH), what you get is the login shell listed in the user database (e.g.
/etc/passwd). When you open a terminal in a GUI environment, you get the shell specified by the
SHELL environment variable if the variable is set. If you want the same shell for text mode logins, either change your login shell with
chsh, or make your login shell switch to your favorite shell with
Occasionally you might encounter a program that uses
$SHELL -c instead of
sh -c to execute code in sh syntax. But that's pretty rare. It's technically allowed by POSIX, but it would violate historical usage. In practice, setting
SHELL is safe. I've had my login shell set to
SHELL set to
/path/to/zsh on most machines for about two decades.