
Ich verwende RHEL6 (Kernel 2.6.32-573.el6.x86_64). Ich habe Aliase, die beim ssh
Aufrufen von verwendet werden myserver
. Einer davon ist
alias scl-devtoolset-3='source /usr/local/bin/scls/devtoolset-3'
Es wird vermutlich in Nicht-Login-Shells als Alias verwendet (siehe unten), aber ssh
ing gibt eine Login-Shell aus, und dies wird durch die Zeile bestätigt
shopt -q login_shell && echo 'This is a login shell' || echo 'This is a non-login shell'
in meinem ~/.bashrc
, die produziert
This is a login shell
wie erwartet. Daher habe ich keine Ahnung, warum/wo der Alias festgelegt ist.
Wie lässt sich dieser scheinbar widersprüchliche Umstand rationalisieren?
In meinem System vorhandene Dateien:
/etc/profile
/etc/bashrc
/etc/profile.d/*
~/.bashrc
In meinem System nicht vorhandene Dateien:
/etc/bash.bashrc
~/.profile
Kurz zusammengefasst
Der Alias scheint (nur in Nicht-Login-Shells) durch die folgenden Zeilen festgelegt zu werden /etc/bashrc
:
...
if ! shopt -q login_shell ; then # We're not a login shell
...
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
...
fi
welche Quelldatei /etc/profile.d/scl-aliases.sh
enthält
#!/bin/bash
sources_dir=/usr/local/bin/scls
for scl in `ls $sources_dir`; do
alias scl-$scl="source $sources_dir/$scl"
done
und angesichts dessen
$ ls /usr/local/bin/scls
devtoolset-3 devtoolset-4 devtoolset-6 python27 python33
bash -x
Dies wurde (teilweise?) durch die Ausführung in der Eingabeaufforderung nach ssh
ing bestätigt .
Antwort1
Dies ist eigentlich ein normales Verhalten. Es hängt von den unterschiedlichen Dateien ab, die von Login- und Nicht-Login-Skripten verwendet werden. Dies wurdeanderswo ausführlich behandeltaber kurz gesagt: (Interaktive) Bash-Shells ohne Anmeldung verwenden die bashrc-Dateifamilie ( /etc/bash.bashrc
, ~/.bashrc
) als Quelle, und (Interaktive) Login-Shells verwenden die verschiedenen Profildateien ( /etc/profile
, ~/.profile
).
Ihr /etc/bashrc
(was meiner Meinung nach das Äquivalent zu /etc/bash.bashrc
macOS und vielleicht auch anderen Systemen ist) wird also nur von interaktiven Nicht-Login-Shells gelesen undRemote-Shell-Daemons. Wenn diese Datei gelesen wird und es sich bei der Shell, die sie liest, um eine Nicht-Login-Shell handelt (also nicht um einen Remote-Shell-Daemon), werden auch bestimmte Dateien darunter geladen /etc/profile.d
.
Login-Shells lesen diese Datei jedoch nicht, daher ist sie hier nicht relevant. Stattdessen lesen sie sie, /etc/profile
und wenn Sie diese Datei überprüfen, werden Sie etwas wie das Folgende finden (aus der /etc/profile
Datei auf meinem Arch):
# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
for profile in /etc/profile.d/*.sh; do
test -r "$profile" && . "$profile"
done
unset profile
fi
Deshalb sehen Sie diese in einer Login-Shell. Das liegt daran, dass Login-Shells nicht durchgehen bashrc
, sondern über eigene Setup-Dateien verfügen, die die Dateien darunter einbringen, /etc/profile.d
ohne jedoch Login-Shells auszuschließen.
Antwort2
Ich poste dies als Antwort, da Kommentare keinen eingerückten Code enthalten können. Ein großes Lob andie Antwort von terdon.
Wie von Terdon angegeben, /etc/profile
enthält meins die folgenden Zeilen.
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
Diese wären für den Alias verantwortlich, nicht /etc/bashrc
. Dies ließe sich leicht mit einer Lösung für überprüfen.Ablaufverfolgung der über SSH ausgeführten Skripte/Befehle