Programas como SSH, sudo , su , etc., iniciam o shell usando a família exec de chamadas do sistema . E essas chamadas de sistema permitem que o programa de chamada especifique cada argumento, incluindo a função. Por exemplo, usando sudo para iniciar um shell de login:
$ strace -fe execve -o sudo.log sudo -i
root:~ $ echo $0
-bash
root:~ $ logout
$ grep bash sudo.log
19124 execve("/bin/bash", ["-bash"], [/* 31 vars */]) = 0
19140 execve("/bin/ls", ["ls", "/etc/bash_completion.d"], [/* 40 vars */]) = 0
Como pode ser visto na primeira chamada execve , a matriz de argumentos passada para bash é apenas ["-bash"] - então o argumento zero é -bash .