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 --loginleer/etc/profile
Eso parece dejar algunos posibles de inicio de sesión conchas (en el que las $0aperturas 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 2016El
$0tiene 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/profilesiempre 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/profilese 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/profilearchivo?
Si lo anterior es cierto, tenemos que concluir que TODOS los shells de inicio de sesión [interactivos (o no)] leen / etc / profile (sin --noprofileopción).
Nota: para detectar que / etc / profile se está leyendo, solo agregue al comienzo del archivo este comando:
echo "'/etc/profile' is being read"


--loginopció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 $- EOFpara 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/profileno se usaría para un shell de inicio de sesión no interactivo a menos--loginque 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/profileno 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
suanomalía , descubrí que otras conchas incluyenzshydashno tienen esta discrepancia.fuente