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

3

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 a opção --login , 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 de shell apenas consultando opções de shell relacionadas como shopt -q login_shell . O que é isso?

  2. Se houver um papel importante de - , por que não podemos vê-lo no shell de login invocado com --login ?

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

  4. É o caso de outros shells como zsh, csh?

por MS.Kim 11.05.2014 / 19:11

2 respostas

4

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:

  1. O papel de - é dizer ao shell para se comportar como um shell de login. Para o bash, passar --login na linha de comando é equivalente.
  2. Você pode ver a função de - no bash chamado com a opção --login - ele lê ~/.profile e assim por diante. Você não pode ver -bash se o bash foi invocado como bash --login em vez de -bash porque o bash não foi chamado como -bash .
  3. 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 bash e com ksh93 , bash ou zsh , você pode fazer (exec -a -bash bash) . Em mksh ou zsh , você pode fazer hash -- -bash=/bin/bash; -bash . Você não pode fazer algo como ln -s /bin/bash ./-bash; ./-bash , pois todo o argv[0] deve começar com - . Você pode fazer PATH=:$PATH; -bash , mas tem esse efeito colateral desagradável de adicionar "" na frente de $PATH .
  4. Sim.

Veja também Diferença entre o Login Shell e Shell sem login?

    
por 12.05.2014 / 03:07
2

Pergunta 1 e 2

Como parte de man bash que você deu em sua pergunta, a página man disse ou . Então você tem duas maneiras de iniciar o shell de login:

  • o primeiro caractere do argumento zero é um - .
  • começou com a opção --login.

e dois sentidos é independente um do outro. Um shell cujo primeiro caractere do argumento zero é um - deve ser um shell de login. Mas um shell cujo primeiro caractere do argumento zero não é um - ainda 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

Pergunta 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 são iguais a bash neste caso.

    
por 11.05.2014 / 20:19