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?<<<"$-"
, das$-
durch die aufrufende Shell aufgrund der doppelten Anführungszeichen erweitert wird. Die aufgerufene Shell ist nicht interaktiv, da ihre stdin keine tty ist.exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF
Um diese Bestätigung zu erhalten:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'
Ja, eine nicht interaktive Anmeldeshell ist möglich und wird weiterhin gelesen/etc/profile
. Sollten wir daraus schließen, dass ALLE Login-Shells gelesen werden/etc/profile
?exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF
:).bash
, die Handhabung der Startdatei ist IMO ziemlich durcheinander. Sie werden feststellen, dass einige Systeme sie gepatcht haben, um ein vernünftigeres Verhalten zu erzielen und noch mehr Variationen hinzuzufügen.Ja, nicht interaktive Login-Shells sind möglich
quelle
su -c 'echo hello' -
.su -c 'echo $0 $-; shopt -p login_shell' -
Um zu testen, was wir brauchen, sollte Folgendes geschrieben werden: um diese bestätigende Antwort zu erhalten (in C-Anführungszeichen kodiert) :$'/etc/profile read \n -su hBc \n shopt -s login_shell'
. Dies bestätigt, dass eine nicht interaktive Login - Shell ausgeführt wurde und dabei / etc / profile gelesen wurde. Vielen Dank.JA.
Beachten Sie jedoch, dass
/etc/profile
dies nicht für eine nicht interaktive Anmeldeshell verwendet wird, wenn das--login
Argument nicht angegeben wird.Eine gebräuchliche Redewendung, die eine nicht interaktive Anmeldeshell aufruft, ist:
Dies leidet jedoch unter der Tatsache, dass
/etc/profile
nicht ausgeführt wird.Es ist möglich, dieses Verhalten zu ändern, aber es umfasst das Anpassen des Bash-Quellcodes zur Kompilierungszeit, indem eine in config-top.h gefundene Option auskommentiert wird :
Als ich diese
su
Anomalie untersuchte , stellte ich fest, dass andere Muscheln diese Diskrepanz enthaltenzsh
unddash
nicht aufweisen.quelle