Por que não podemos ver um único hífen de $0 em um shell de login invocado com a opção `--login`?

Por que não podemos ver um único hífen de $0 em um shell de login invocado com a opção `--login`?

man bashdiz,

 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 --loginopção, não poderemos ver -.

$bash --login
$echo $0
bash

Minhas perguntas são:

  1. 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, como shopt -q login_shell. Para que serve?

  2. Se existe uma função importante de -, por que não podemos vê-la no shell de login invocado com --login?

  3. Como podemos invocar manualmente um shell de login cujo argumento zero começa com -?

  4. É 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 — loginou 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 -lopção de linha de comando).

Para responder às suas perguntas:

  1. A função de -é dizer ao shell para se comportar como um shell de login. Para o bash, passar --loginna linha de comando é equivalente.
  2. Você pode ver opapel de-no bash chamado com a --loginopção - ele lê ~/.profilee assim por diante. Você não pode ver -bashse o bash foi invocado como bash --logine não -bashporque o bash não foi invocado como -bash.
  3. 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 bashe com ksh93, bashou zsh, você pode fazer (exec -a -bash bash). Em mkshou zsh, você pode fazer hash -- -bash=/bin/bash; -bash. Você não pode fazer algo assim, ln -s /bin/bash ./-bash; ./-bashpois é o todo argv[0]que deve começar -. Você poderia fazer isso PATH=:$PATH; -bash, mas tem aquele efeito colateral desagradável de adicionar ""na frente de $PATH.
  4. Sim.

Veja tambémDiferença entre Shell de login e Shell sem login?

Responder2

Questão 1 e 2

Como parte do man bashque 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, zshe cshé o mesmo que bashneste caso.

informação relacionada