man bash
dice,
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 --login
la opción, no podremos ver -
.
$bash --login
$echo $0
bash
Mis preguntas son:
¿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 comoshopt -q login_shell
. ¿Para qué sirve?Si hay una función importante de
-
, ¿por qué no podemos verla en el shell de inicio de sesión invocado--login
?¿Cómo podemos invocar manualmente un shell de inicio de sesión cuyo argumento cero comienza con
-
?¿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, login
o 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 -l
opción de línea de comando).
Para responder tu pregunta:
- La función de
-
es decirle al shell que se comporte como un shell de inicio de sesión. Para bash, pasar--login
la línea de comando es equivalente. - Puedes ver elpapel de
-
en bash se llama con la--login
opción: lee~/.profile
, etc. No puede ver-bash
si bash se invocó comobash --login
en lugar de-bash
porque bash no se invocó como-bash
. - Los shells típicos no le permiten elegir el argumento cero, tiene que ser el nombre del comando. Con zsh, puedes hacer
ARGV0=-bash bash
y conksh93
,bash
ozsh
, puedes hacer(exec -a -bash bash)
. Enmksh
ozsh
, puedes hacerlohash -- -bash=/bin/bash; -bash
. No puedes hacer algo asíln -s /bin/bash ./-bash; ./-bash
porque es el todoargv[0]
con el que hay que empezar-
. Podrías hacerloPATH=:$PATH; -bash
, pero luego tiene ese desagradable efecto secundario de agregarlo""
delante de$PATH
. - 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 bash
eso 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, zsh
y csh
es lo mismo que bash
en este caso.