Une catégorie de Shell (Non-interactive, login Shell avec options hBc) est manquante dans le fichier réponse acceptée . Elle est couramment utilisée contrairement à celle avec les options hBs pour exécuter une commande dans une session ssh. Pour s'en rendre compte, il suffit de comparer 4 et 5. Je l'ai inclus avec d'autres.
# Combination of login and interactive shells
#1. Interactive, login shell: himBHs
{
bash --login
echo $-
shopt login_shell
logout # use CTRL-D : Note the difference here between 1 and 2
}
#2. Interactive, no-login shell: regular terminal: himBHs
{
bash
echo $-
shopt login_shell
exit # use CTRL-D : Note the difference here between 1 and 2
}
#3. Interactive, no-login shell: executing commands from standard input - scripts: himBHs
{
cat <<-EOF > myfile && bash -s < myfile
echo $-
shopt login_shell
EOF
}
#4. Non-interactive, login shell - takes commands from standard input - pipes: hBs
echo 'echo $-; shopt login_shell' | ssh localhost
#5. Non-interactive, login shell - executes commands : hBc
ssh localhost 'echo $-; shopt login_shell'
#6. Non-interactive, no-login shell : hBc
bash -c 'echo $-; shopt login_shell'
Qu'est-ce qu'un login Shell ?
Il lit et exécute les commandes du premier fichier disponible (s'il existe) pendant la session de connexion dans l'ordre suivant :
- /etc/profil
- ~/.bash_profile,
- ~/.bash_login, et
- ~/.profile
Il lit et exécute les commandes de tous les fichiers (s'ils existent) pendant la déconnexion dans l'ordre suivant :
- ~/.bash_logout et
- /etc/bash.bash_logout
Nota: La différence entre l'appel des fichiers de connexion (uniquement le premier fichier disponible) et des fichiers de déconnexion (tous les fichiers).
echo 'echo "Logging out ... $(date)"' >> ~/.bash_logout
echo 'echo "Logging out from /etc/bash.bash_logout... $(date)"' | sudo tee -a /etc/bash.bash_logout
bash --login
Ctrl-D # logs out
Nota: Une confusion surgit toujours lorsque ~/.bashrc
Les commandes de fichiers sont exécutées pendant la session de connexion Shell. En général, les commandes dans ~/.bashrc
ne doit pas être exécuté pendant que le login Shell . Cependant, si elle se produit, c'est à cause de ~/.bash_profile
Le fichier comprend ~/.bashrc
dans ce fichier. Vérifiez votre ~/.bash_profile
fichier. Il s'agit d'un comportement courant dans les distributions Linux basées sur Fedora.
Qu'est-ce qu'un Shell sans ouverture de session ?
Il lit et exécute les commandes du fichier de configuration spécifique à l'utilisateur : ~/.bashrc
Qu'est-ce qu'une session non interactive ?
Il lit et exécute les commandes de BASH_ENV
variable. C'est également un moyen de contrôler le comportement d'une session non interactive.
echo "HELLO=WORLD" > ~/myrc
BASH_ENV=~/myrc bash -c 'echo $BASH_ENV; echo $HELLO'
Nota: BASH_ENV
doit contenir le chemin complet du fichier Shell-Shell.
Nota: La session ssh remote non-interactive Shell ne lit pas BASH_ENV
. Au lieu de cela, le texte est le suivant ~/.bashrc
de l'utilisateur distant dans le système distant.
Nota: ssh
les sessions distantes n'exécutent pas les commandes des fichiers mentionnés dans le login Shell (~/.bash_profile).
Cela ne fonctionnera pas :
BASH_ENV=~/myrc ssh localhost 'echo $BASH_ENV; echo $HELLO'
ssh remoteuser@localhost 'echo $HELLO'
Cela fonctionnera : Parce que, .bashrc
appartient à l'utilisateur actuel qui est supposé être l'utilisateur distant, et le système distant est supposé être localhost dans cet exemple.
echo 'HELLO=WORLD' >> ~/.bashrc
ssh localhost 'echo $HELLO'
Comment contrôler le comportement du login Shell ?
-
en utilisant --noprofile
pour désactiver la lecture des commandes des fichiers mentionnés ci-dessus dans le login Shell.
echo "HELLO=WORLD1" >> ~/.bash_profile
bash --login
echo $HELLO
bash --login --noprofile
echo $HELLO
Comment contrôler le comportement de no-login Shell ?
- en utilisant
--rcfile
option permettant de spécifier un fichier rc spécifique à l'utilisateur
- en utilisant
--norc
option pour désactiver la lecture des commandes des fichiers mentionnés ci-dessus dans no-login Shell.