O traço principal no nome do processo (em argv[0] , para ser preciso) é colocado ali pelo processo que chama o shell - login ou algum equivalente. Ele diz ao programa de shell que ele deve agir como um shell de login (leia .profile , etc.). O programa shell pode escolher atuar como um shell de login em outras circunstâncias (por exemplo, bash e zsh agem como um shell de login se passarem pela opção de linha de comando -l ).
Para responder às suas perguntas:
- O papel de
-é dizer ao shell para se comportar como um shell de login. Para o bash, passar--loginna linha de comando é equivalente. - Você pode ver a função de
-no bash chamado com a opção--login- ele lê~/.profilee assim por diante. Você não pode ver-bashse o bash foi invocado comobash --loginem vez de-bashporque o bash não foi chamado como-bash. - Cascas típicas não permitem que você escolha o argumento zeroth, ele deve ser o nome do comando. Com zsh, você pode fazer
ARGV0=-bash bashe comksh93,bashouzsh, você pode fazer(exec -a -bash bash). Emmkshouzsh, você pode fazerhash -- -bash=/bin/bash; -bash. Você não pode fazer algo comoln -s /bin/bash ./-bash; ./-bash, pois todo oargv[0]deve começar com-. Você pode fazerPATH=:$PATH; -bash, mas tem esse efeito colateral desagradável de adicionar""na frente de$PATH. - Sim.
Veja também Diferença entre o Login Shell e Shell sem login?