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?<<<"$-"
, qui$-
est développé par le shell appelant à cause des guillemets doubles. Le shell appelé n'est pas interactif car son stdin n'est pas un tty.exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF
pour obtenir cette confirmation:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'
Donc, oui, un shell de connexion non interactif est possible, et il est toujours lu/etc/profile
. Faut-il conclure que TOUS les shells de connexion sont lus/etc/profile
?exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF
:).bash
, la gestion des fichiers de démarrage est assez foireuse IMO, vous constaterez que certains systèmes l'ont corrigé pour avoir un comportement plus raisonnable en ajoutant encore plus de variation.Oui, des shells de connexion non interactifs sont possibles
la source
su -c 'echo hello' -
. Ce qui, pour tester ce que nous avons besoin, devrait être écrit:su -c 'echo $0 $-; shopt -p login_shell' -
pour obtenir cette réponse de confirmation (codé entre guillemets C):$'/etc/profile read \n -su hBc \n shopt -s login_shell'
. Cela confirme qu'un shell de connexion non interactif a été excuté et que, dans le processus, / etc / profile a été lu. Merci.OUI.
Cependant, notez que
/etc/profile
cela ne serait pas utilisé pour un shell de connexion non interactif à moins que l'--login
argument ne soit donné.Un idiome commun qui appelle un shell de connexion non interactif est:
Mais cela souffre du fait qu'il
/etc/profile
ne soit pas exécuté.Il est possible de modifier ce comportement mais cela implique de personnaliser le code source de Bash au moment de la compilation en décommentant une option trouvée dans config-top.h :
Lorsque j'ai recherché cette
su
anomalie , j'ai constaté que d'autres obus, y compriszsh
etdash
n'ont pas cet écart.la source