Para ter um -
como o primeiro caractere do nome do comando é apenas uma maneira de sinalizar um shell de login, existem outros sinais. Na verdade, a maneira correta de detectar que o shell atual é um shell de login é perguntar ao próprio shell.
No manual bash:
A login shell is one whose first character of argument zero is a -, or one started with the --login option.
No bash:
shopt -p login_shell
Será impressa -u
se o shell não for o login e -s
se for.
Vamos testá-lo:
$ ln -s $(which bash) ./-bash # make a local copy of bash
$ PATH=$PATH:. # Big security problem, don't use it.
$ -bash # start the local copy of bash
$ echo $0 # Its name start with an -
-bash
$ shopt -p login_shell # Is it a login shell?
shopt -s login_shell # Yes!, the answer is -s
$ exit # leave the login shell
$ PATH=${PATH%:.} # Remove the local pwd from the path.
$ rm ./-bash # Remove the local copy of bash
Na verdade, esse $ 0 tem um - não tem que significar que o shell é um shell de login:
$ bash -c 'echo $0; shopt -p login_shell' -bash 1 2 3
-bash
shopt -u login_shell
A outra maneira (do manual) para obter um shell de login, é só pedir:
$ bash --login # ask for a login shell
$ echo $0 # What is its name?
bash
$ shopt -p login_shell # Is it a login shell?
shopt -s login_shell # Yes, it is!
$ exit # leave the login shell.