En interprétant cet organigramme
J'ai trouvé que dans man bash:
Lorsque bash est appelé en tant que shell de connexion interactif ou en tant que shell non interactif avec l'option --login, il lit et exécute d'abord les commandes du fichier / etc / profile, si ce fichier existe.
Cela indique que les shells de connexion interactifs lisent /etc/profile
(sans --noprofile)
En outre, les shells non interactifs avec l'option --login
lire/etc/profile
Cela semble laisser certains shells de connexion possibles (dans lesquels $0
commence par a -
) qui étant non interactifs (exécutez un script, peut-être aussi simple que date
) peuvent ne pas lire (source) /etc/profile
.
Pour confirmer ou infirmer cette idée:
J'ai d'abord essayé d'utiliser su -l -
, qui démarre un shell de connexion avec un -
comme premier caractère mais je n'arrive pas à le rendre non interactif (et à pouvoir présenter les tests pour le tester).
Appeler quelque chose comme
$ bash -c 'date' -bash
Ne signale pas être un shell de connexion (même si le premier caractère est un -
).
Essayez ceci pour révéler le détail:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
Le
$0
a-
comme premier caractère, il n'y a pasi
(interactif) dans la valeur de$-
mais il n'est pas signalé commelogin_shell
(le -u). Dans ce cas, / etc / profile n'a pas été lu, mais je ne suis pas sûr que ce soit le bon test.
Il y a aussi la mention des «shells de connexion non interactifs rares» dans cette réponse sans être suffisamment précis pour cette question.
La conclusion de ce type est qu'il /etc/profile
est toujours lu.
Lire le tableau récapitulatif: les shells de connexion interactifs et non interactifs lisent /etc/profile
Et, si les exemples de cette page sont corrects:
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`
Le test des exec su - bob -c 'env'
rapports qui a /etc/profile
été lu.
En bref:
Est-il possible d'avoir un shell de connexion non interactif (non appelé avec --login ou -l)?
Et si c'est vrai, lit-il le /etc/profile
fichier?
Si ce qui précède est vrai, nous devons conclure que TOUS les shells de connexion [interactifs (ou non)] lisent / etc / profile (sans --noprofile
option).
Remarque: pour détecter que / etc / profile est en cours de lecture, ajoutez simplement au tout début du fichier cette commande:
echo "'/etc/profile' is being read"
--login
option. Pour le second, si jeexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
reçois (encodé en C qoutes)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
donc, c'est login mais c'est interactif. Nous avons besoin de connexion et non interactif . Qu'est-ce qui me manque?