¿Por qué no podemos ver un solo guión desde $0 en un shell de inicio de sesión invocado con la opción `--login`?

¿Por qué no podemos ver un solo guión desde $0 en un shell de inicio de sesión invocado con la opción `--login`?

man bashdice,

 A login shell is one whose first character of argument zero is a -,  or
 one started with the --login option.

Cuando invocamos una terminal como mintty -Cygwin, podemos ver un solo guión ( -) desde $0.

$ echo $0
-bash

Pero si invocamos un shell de inicio de sesión con --loginla opción, no podremos ver -.

$bash --login
$echo $0
bash

Mis preguntas son:

  1. ¿Cuál es el papel de -? Aunque no podemos verlo al iniciar sesión en el shell invocado --login, podemos verificar el tipo de shell simplemente consultando opciones de shell relacionadas como shopt -q login_shell. ¿Para qué sirve?

  2. Si hay una función importante de -, ¿por qué no podemos verla en el shell de inicio de sesión invocado --login?

  3. ¿Cómo podemos invocar manualmente un shell de inicio de sesión cuyo argumento cero comienza con -?

  4. ¿Es el caso de otros shells como zsh, csh?

Respuesta1

El guión inicial en el nombre del proceso (en argv[0], para ser precisos) lo coloca allí el proceso que llama al shell, logino algún equivalente. Le dice al programa shell que debe actuar como un shell de inicio de sesión (lectura .profile, etc.). El programa shell puede optar por actuar como un shell de inicio de sesión en otras circunstancias (por ejemplo, bash y zsh actúan como un shell de inicio de sesión si se les pasa la -lopción de línea de comando).

Para responder tu pregunta:

  1. La función de -es decirle al shell que se comporte como un shell de inicio de sesión. Para bash, pasar --loginla línea de comando es equivalente.
  2. Puedes ver elpapel de-en bash se llama con la --loginopción: lee ~/.profile, etc. No puede ver -bashsi bash se invocó como bash --loginen lugar de -bashporque bash no se invocó como -bash.
  3. Los shells típicos no le permiten elegir el argumento cero, tiene que ser el nombre del comando. Con zsh, puedes hacer ARGV0=-bash bashy con ksh93, basho zsh, puedes hacer (exec -a -bash bash). En mksho zsh, puedes hacerlo hash -- -bash=/bin/bash; -bash. No puedes hacer algo así ln -s /bin/bash ./-bash; ./-bashporque es el todo argv[0]con el que hay que empezar -. Podrías hacerlo PATH=:$PATH; -bash, pero luego tiene ese desagradable efecto secundario de agregarlo ""delante de $PATH.
  4. Sí.

Ver también¿Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?

Respuesta2

Pregunta 1 y 2

Como parte de man basheso que das en tu pregunta, la página de manual decíao. Entonces tienes dos maneras de iniciar el shell de inicio de sesión:

  • El primer carácter del argumento cero es un -.
  • comenzó con la opción --login.

y dos vías son independientes entre sí. Un shell cuyo primer carácter del argumento cero es un- debeser un shell de inicio de sesión. Pero un shell cuyo primer carácter del argumento cero no es -todavía puede ser un shell de inicio de sesión o no. Es un shell de inicio de sesión cuando se invoca con --login.

Otra forma de comprobar un shell de inicio de sesión:

$ cuonglm at ~
$ bash --login
$ cuonglm at ~
$ grep -- -l /proc/$$/cmdline
Binary file /proc/7620/cmdline matches

Pregunta 3

Una forma sencilla:

$ cuonglm at ~
$ sudo su -
% root at ~
% shopt -q login_shell && echo "Login shell" || echo "Not login shell"
Login shell

Pregunta 4

AFAIK, zshy cshes lo mismo que bashen este caso.

información relacionada