man bash
diz,
A login shell is one whose first character of argument zero is a -, or
one started with the --login option.
Quando invocamos um terminal como mintty -
no Cygwin, podemos ver um único hífen ( -
) de $0.
$ echo $0
-bash
Mas se invocarmos um shell de login com --login
opção, não poderemos ver -
.
$bash --login
$echo $0
bash
Minhas perguntas são:
Qual é o papel de
-
? Embora não possamos vê-lo no shell de login invocado--login
, podemos verificar o tipo do shell apenas consultando opções de shell relacionadas, comoshopt -q login_shell
. Para que serve?Se existe uma função importante de
-
, por que não podemos vê-la no shell de login invocado com--login
?Como podemos invocar manualmente um shell de login cujo argumento zero começa com
-
?É o caso de outros shells como zsh, csh?
Responder1
O traço inicial no nome do processo (in argv[0]
, para ser mais preciso) é colocado lá pelo processo que chama o shell — login
ou algum equivalente. Ele informa ao programa shell que ele deve atuar como um shell de login (read .profile
, etc.). O programa shell pode optar por atuar como um shell de login em outras circunstâncias (por exemplo, bash e zsh atuam como um shell de login se for aprovada a -l
opção de linha de comando).
Para responder às suas perguntas:
- A função de
-
é dizer ao shell para se comportar como um shell de login. Para o bash, passar--login
na linha de comando é equivalente. - Você pode ver opapel de
-
no bash chamado com a--login
opção - ele lê~/.profile
e assim por diante. Você não pode ver-bash
se o bash foi invocado comobash --login
e não-bash
porque o bash não foi invocado como-bash
. - Os shells típicos não permitem escolher o argumento zero, ele deve ser o nome do comando. Com zsh, você pode fazer
ARGV0=-bash bash
e comksh93
,bash
ouzsh
, você pode fazer(exec -a -bash bash)
. Emmksh
ouzsh
, você pode fazerhash -- -bash=/bin/bash; -bash
. Você não pode fazer algo assim,ln -s /bin/bash ./-bash; ./-bash
pois é o todoargv[0]
que deve começar-
. Você poderia fazer issoPATH=:$PATH; -bash
, mas tem aquele efeito colateral desagradável de adicionar""
na frente de$PATH
. - Sim.
Veja tambémDiferença entre Shell de login e Shell sem login?
Responder2
Questão 1 e 2
Como parte do man bash
que você forneceu em sua pergunta, a página de manual diziaou. Então você tem duas maneiras de iniciar o shell de login:
- o primeiro caractere do argumento zero é a
-
. - começou com a opção --login.
e duas vias são independentes uma da outra. Um shell cujo primeiro caractere do argumento zero é um-
deveser um shell de login. Mas um shell cujo primeiro caractere do argumento zero não é -
still pode ser um shell de login ou não. É um shell de login quando invocado com --login
.
Outra maneira de verificar um shell de login:
$ cuonglm at ~
$ bash --login
$ cuonglm at ~
$ grep -- -l /proc/$$/cmdline
Binary file /proc/7620/cmdline matches
Questão 3
Uma maneira simples:
$ cuonglm at ~
$ sudo su -
% root at ~
% shopt -q login_shell && echo "Login shell" || echo "Not login shell"
Login shell
Pergunta 4
AFAIK, zsh
e csh
é o mesmo que bash
neste caso.