Al interpretar este diagrama de flujo
Encontré eso en man bash:
Cuando se invoca bash como un shell de inicio de sesión interactivo, o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos del archivo / etc / profile, si ese archivo existe.
Eso indica que los shells de inicio de sesión interactivos leen /etc/profile
(sin --noprofile)
Además, shells no interactivos con la opción --login
leer/etc/profile
Eso parece dejar algunos posibles de inicio de sesión conchas (en el que las $0
aperturas con una -
) que se no interactivo (ejecutar un script, tal vez lo más simple date
) no pueden leer (fuente) /etc/profile
.
Para confirmar o negar esta idea:
Primero intenté usarlo su -l -
, que inicia un shell de inicio de sesión con a -
como primer carácter, pero no lo hago no interactivo (y no puedo presentar las pruebas para probarlo).
Llamando algo como
$ bash -c 'date' -bash
No informa que sea un shell de inicio de sesión (incluso si el primer carácter es a -
).
Prueba esto para revelar los detalles:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
El
$0
tiene un-
como el primer carácter, no hayi
(interactivo) en el valor de$-
pero no se informa comologin_shell
(el -u). En este caso, / etc / profile no se leyó, pero no estoy seguro de que esta sea la prueba correcta.
También hay una mención de "shells de inicio de sesión no interactivos raros" en esta respuesta sin ser lo suficientemente específicos para esta pregunta.
La conclusión de este tipo es que /etc/profile
siempre se lee.
Lea la tabla de resumen: lea los shells de inicio de sesión interactivos y no interactivos /etc/profile
Y, si los ejemplos de esta página son correctos:
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
La prueba de los exec su - bob -c 'env'
informes que /etc/profile
se leyó.
En breve:
¿Es posible tener un shell de inicio de sesión no interactivo (no llamado con --login o -l)?
Y si es cierto, ¿está leyendo el /etc/profile
archivo?
Si lo anterior es cierto, tenemos que concluir que TODOS los shells de inicio de sesión [interactivos (o no)] leen / etc / profile (sin --noprofile
opción).
Nota: para detectar que / etc / profile se está leyendo, solo agregue al comienzo del archivo este comando:
echo "'/etc/profile' is being read"
--login
opción. Para el segundo, si lo hagoexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
, obtengo (codificado en C qoutes)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
, entonces, es login pero es interactivo. Necesitamos inicio de sesión y no interactivo . ¿Qué es lo que me estoy perdiendo?<<<"$-"
, que$-
se expande por el shell de llamada debido a las comillas dobles. El shell llamado no es interactivo porque su stdin no es un tty.exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF
para obtener esta confirmación:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'
Entonces, sí, es posible un shell de inicio de sesión no interactivo, y aún así se lee/etc/profile
. ¿Deberíamos concluir que TODOS los shells de inicio de sesión se leen/etc/profile
?exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF
:).bash
, el manejo del archivo de inicio es bastante complicado, verás que algunos sistemas lo han parcheado para tener un comportamiento más razonable agregando aún más variación.Sí, son posibles shells de inicio de sesión no interactivos
fuente
su -c 'echo hello' -
. Lo cual, para poner a prueba lo que necesitamos, debe escribirse como:su -c 'echo $0 $-; shopt -p login_shell' -
para obtener esta respuesta confirmando (codificado en C comillas):$'/etc/profile read \n -su hBc \n shopt -s login_shell'
. Eso confirma que se ejecutó un shell no interactivo de inicio de sesión y que, en el proceso, se leyó / etc / profile. Gracias.SI.
Sin embargo, tenga en cuenta que
/etc/profile
no se usaría para un shell de inicio de sesión no interactivo a menos--login
que se proporcione el argumentoUn idioma común que invoca un shell de inicio de sesión no interactivo es:
Pero esto sufre el hecho de que
/etc/profile
no se ejecuta.Es posible cambiar este comportamiento, pero implica personalizar el código fuente de Bash en tiempo de compilación al descomentar una opción que se encuentra en config-top.h :
Cuando investigué esta
su
anomalía , descubrí que otras conchas incluyenzsh
ydash
no tienen esta discrepancia.fuente