Bei der Interpretation dieses Flussdiagramms
Ich fand das in man bash:
Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist.
Das heißt, dass interaktive Login- Shells gelesen werden /etc/profile
(ohne --noprofile)
Auch nicht interaktive Shells mit der Option --login
lesen/etc/profile
Das scheint einige mögliche Login- Shells zu hinterlassen (in denen das $0
mit a beginnt -
), die nicht interaktiv sind (ein Skript ausführen, vielleicht so einfach wie date
), möglicherweise nicht gelesen werden (Quelle) /etc/profile
.
Um diese Idee zu bestätigen oder abzulehnen:
Zuerst habe ich versucht su -l -
, eine Login-Shell mit einem -
als erstes Zeichen zu starten, aber ich kann sie nicht interaktiv machen (und in der Lage sein, die Tests zu präsentieren, um sie zu testen).
So etwas nennen
$ bash -c 'date' -bash
Gibt nicht an, eine Anmeldeshell zu sein (selbst wenn das erste Zeichen a ist -
).
Versuchen Sie dies, um das Detail zu enthüllen:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
Das
$0
hat ein-
als erstes Zeichen, es gibt keini
(interaktives) im Wert von,$-
aber es wird nicht alslogin_shell
(das -u) gemeldet . In diesem Fall wurde / etc / profile nicht gelesen, aber ich bin nicht sicher, ob dies der richtige Test ist.
In dieser Antwort werden auch "seltene nicht interaktive Login-Shells" erwähnt , ohne für diese Frage spezifisch genug zu sein.
Die Schlussfolgerung dieses Typen ist, dass /etc/profile
immer gelesen wird.
Lesen Sie die Übersichtstabelle: Es werden sowohl interaktive als auch nicht interaktive Login-Shells gelesen /etc/profile
Und wenn die Beispiele auf dieser Seite korrekt sind:
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`
Der Test der gelesenen exec su - bob -c 'env'
Berichte /etc/profile
.
Zusamenfassend:
Ist es möglich, eine nicht interaktive Anmeldeshell zu haben (nicht mit --login oder -l aufgerufen)?
Und wenn ja, liest es die /etc/profile
Datei?
Wenn das oben Gesagte zutrifft, müssen wir daraus schließen, dass ALLE Login-Shells [interaktiv (oder nicht)] / etc / profile (ohne --noprofile
Option) lesen .
Hinweis: Um festzustellen, dass / etc / profile gelesen wird, fügen Sie einfach ganz am Anfang der Datei diesen Befehl hinzu:
echo "'/etc/profile' is being read"
--login
Option. Für das zweite, wenn ich esexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
bekomme (in C qoutes codiert)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
, ist es Login, aber es ist interaktiv. Wir brauchen Login und nicht interaktiv . Was fehlt mir?