Je lisais la différence entre sudo -i/-s
ici . Après avoir utilisé la commande, shopt
il est à noter que tous ( sudo su/sudo -i/sudo -s
) $SHELL
fournissent les mêmes résultats, mais les shopt
résultats de la commande sont différents.
Alors, comment le shell de connexion et non de connexion est-il défini?
D'où shopt
obtenir le résultat?
Pourquoi ce n'est pas lié à $SHELL
?
sudo su
givinv@87-109:~$ sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
sudo -i
givinv@87-109:~$ sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
sudo -s
root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
command-line
bash
sudo
prado
la source
la source
.profile
ou des équivalents), et 2. C'est le shell qui est censé démarrer à la connexion pour un utilisateur, tel que défini dans/etc/passwd
ou équivalent.$SHELL
contient le dernier, vosshopt
sorties concernent le premier. En règle générale, lorsque le shell dans (2) est démarré à la connexion, il est démarré de la manière spécifique requise pour (1), d'où la fusion des significations.$SHELL
(et le connecterait à un pseudo terminal) qui à son tour est défini dans votre entrée / etc / passwd. ce shell est un shell de connexion et peut être testé avecif [[ -o login ]]; then echo "I am a login shell"; fi
. étant un shell de connexion, il effectuerait les tâches appropriées à une nouvelle session. par exemple source~/.zprofile
ou similaire qui pourrait éventuellement définir des variables d'environnement et tout code shell personnalisé que vous voudrez peut-être exécuter à ce momentRéponses:
TL; DR :
/etc/passwd
.sudo su
/sudo su -
/sudo -i
/sudo -s
identiques? Non, ils engendrent tous une coquille mais différemment et dans des contextes différents.$SHELL
-il? Indiquez simplement votre shell par défaut, comme dans/etc/passwd
.Réponse réelle :
Tout d'abord, il est important de mentionner que
shopt
c'est spécifique à bash. Par exemple, je suismksh
un utilisateur shell, et il n'en a passhopt
, tout commeksh
ne le fait pas.Ensuite, qu'est-ce qui
login_shell
est censé représenter exactement ? Deman bash
:Voilà le point clé.
sudo -i
, comme vous le savez déjà dans la réponse précédente que vous lisez, est censé simuler la connexion initiale. C'est pourquoi lesshopt
rapportslogin_shell on
pour cette option. Considérez ceci comme sisudo -i
force le shell à parcourir les fichiers qui ne devraient apparaître que pendant un processus de connexion (qui ne sont pas fournis par des shells interactifs).Dans d'autres cas, vous exécutez déjà une instance d'un shell, il ne peut donc pas s'agir d'un shell de connexion en premier lieu, et le but des options est différent.
sudo -s
lit simplement$SHELL
(qui est censée représenter votre shell par défaut tel que défini dans/etc/passwd
) et l'exécute avec le privilège root. Cela équivaut à fairesudo $SHELL
ousudo mksh
ousudo bash
(selon ce que vous utilisez).Rappelez-vous que j'ai mentionné que je suis
mksh
utilisateur? Regarde ça:Ce que vous voyez, c'est que j'ai
sudo -s
sauté debash
mamksh
coquille, avec l'invite caractéristique que je lui ai définie. Et bien sûr, puisqu'il ne s'agit pas d'une action de connexion, carbash
cela signifierait que le shell est généré en tant qu'instance de shell sans connexion. Dans mon cas, cependant, vous voyez qu'il$-
n'y a pas de lettrel
, qui serait là s'il s'agissait d'une instance de shell de connexion.Enfin, la même idée s'applique à
sudo su
etsudo su -
. Plus tard, on génère une instance de shell de connexion (c'est-à-dire que les fichiers spécifiques requis pour la connexion s'exécuteront) et l'ancien ne génère que des shells interactifs (c'est-à-dire que les fichiers de connexion ne s'exécutent pas).Donc, techniquement,
shopt login_shell
n'a aucun rapport avec$SHELL
quoi que ce soit. Pensez-y de cette façon: son but est de montrer comment bash fonctionne.$SHELL
est censé refléter uniquement ce que vous avez attribué/etc/passwd
.Quant à la différence entre le shell de connexion et le shell sans connexion, elle a été expliquée par Gilles très respecté sur unix.stackexchange.com dans cette réponse .
Amusement supplémentaire
Voici quelque chose d'amusant que vous pouvez essayer. Comme vous le savez peut-être déjà, un shell de connexion s'exécutera
.profile
(et.bashrc
puisque Ubuntu.profile
est configuré pour le faire ), mais l'enfer non-connecté exécutera uniquement un.bashrc
fichier. Nous pouvons donc tester avececho
laquelle de ces commandes exécute un shell de connexion et laquelle ne le fait pas, et nous attendons deux lignes deecho
shell de connexion et une seule pour les non-login.Assez convenablement, ceux avec deux lignes de sortie se seront
login_shell
mis àon
.la source
$SHELL
etlogin_shell/non-login_shell
clarifié. Mais d'oùshopt
viennent les détails? Est-ce deecho $0
?$0
est utilisé pour indiquer si un shell est un shell de connexion, donc ifshopt
vérifierait cette variable - bien sûr, c'est parfaitement acceptable. Cependant, il y a probablement plus que ce que l'on voit.shopt
probablement Pour cette question, je n'ai pas de réponse difficile, car je ne connais pas très bien le code source de bash.-
, soit en utilisant l'-l
option.login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.
que leshopt login_shell
bash semble être à sens unique vous permet de découvrir - par programme comment savoir comment il a été démarré. l'autre solution serait[[ -o login ]]
Comme @Serg l'explique dans cette réponse sur la façon de savoir quel shell vous exécutez , la
SHELL
variable est juste le shell par défaut de l'utilisateur actuel comme lu dans/etc/passwd
:donc si je
echo $SHELL
reviendrai toujours/bin/bash
:Que ce soit ou non le shell est un shell de connexion, est un sh ell opt ion déterminé au moment où le shell est lancé. Le programme shell stocke ces informations avec tous ses autres paramètres et variables. La
shopt
commande fournit un moyen de voir ces informations et, si possible pour l'option en question, de les définir ou de les désactiver (ce n'est pas le cas pourlogin_shell
lequel, bien sûr, dépend du processus utilisé pour démarrer le shell)Les
sudo
options du programme déterminent comment ces différents types de shell racine seront démarrés:la source
shopt
et que vouslogin_shell
êtes censé représenter bien mieux que cela dans ma réponse.man bash
:man login
:En bref:
$SHELL
est définie parlogin
ou par le programme appelant, par exemplesu
. Le shell lui-même ne le définit pas.shopt
montre les options du shell actuellement en vigueur.la source