Ich habe gerade viel Zeit damit verbracht, mich über Login und interaktive Shells zu informieren und warum man die Umgebung einstellen sollte oder nicht Variablen, Shell-Funktionen usw. in den verschiedenen Profil- und Bashrc-Dateien. In dieses Beitrags wurde erwähnt, dass bash-spezifische Dinge wie Eingabeaufforderungsoptionen in ~ / .bashrc festgelegt werden sollten. Das hat mich dazu gebracht, mich über die PS1-Variable zu wundern. In allen Beispielen, die ich diesbezüglich gesehen habe, haben sie so etwas wie export PS1=""
. Sollte dies wirklich in die Umgebung exportiert werden, da es nur eine Bedeutung für bash hat? Nur PS1=""
in meinem ~ / .bashrc erzeugt den beabsichtigten Effekt für mich, aber ich frage mich, ob mir etwas fehlt.
Antwort
Das ist richtig: PS1
ist nur in interaktiven Instanzen von bash von Bedeutung, daher sollte es in ~/.bashrc
und sollte nicht exportiert werden. PS1
ist auch in anderen Shells von Bedeutung, hat jedoch eine andere Bedeutung, da sich die prompten Erweiterungen zwischen den Shells unterscheiden. Tatsächlich kann PS1
auch zwischen Bash-Instanzen unterschiedliche Bedeutungen haben, da die Bedeutung von den Shell-Optionen abhängt (mindestens promptvars
).
Das Exportieren von PS1
aus .profile
in die Umgebung ist ein Rückfall in die 1970er Jahre, als es nur eine Shell gab hat es verwendet (die Bourne-Shell) und es hatte keine Konfigurationsdatei. Es funktioniert auch heute noch, wenn Sie immer dieselbe Shell verwenden und sie nie anders konfigurieren. Aber alle modernen Shells, die nicht nur für Skripte entwickelt wurden (csh, ksh) , bash, zsh,…) beim interaktiven Start eine Konfigurationsdatei lesen (.cshrc
, .kshrc
, .bashrc
, .zshrc
,…), sodass die Methode der 1970er Jahre nicht mehr erforderlich ist. Wenn Sie PS1
und andere Shell-spezifische Einstellungen in einer Shell-spezifischen Datei festlegen und nicht in die Umgebung exportieren, werden Fehler vermieden, wenn Sie eine andere Shell-Konfiguration oder eine andere Shell oder eine andere Shell verwenden Ein anderes Terminal, das nicht in der Lage ist, Ihre übliche sofortige Fantasie zu zeigen. Das Festlegen von PS1
in einer Shell-spezifischen Datei funktioniert ständig, während das Festlegen von .profile
und das Exportieren funktioniert nur in „einfachen“ Fällen, daher gibt es keinen Grund, es nicht richtig zu machen, aber es gibt viele schlechte Tutorials im Web und sogar schlechte Standardkonfigurationen in Distributionen. C „est la vie .
Kommentare
- Wie wird
PS1
from.profile
funktioniert für Bash-Shells ohne Anmeldung, da sie ' nicht als Quelle dienen würden? Wollen Sie damit sagen, dass dies funktionieren würde, weil die Nicht- Die Anmeldeshell würde von einer Anmeldeshell gegabelt, umPS1
über die Umgebung zu erben? - @MikeSweeney Ja, das ' s warum es ' s exportiert .
- Eine Möglichkeit, die falsche Idee über den Export von PS1 zu verbreiten, besteht darin,
if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi
– wird häufig in den .bashrc-Dateien von Personen ' angezeigt, um nur Dinge wie die Befehlsvervollständigung zu laden, wenn dies ein Benutzer ist ' s interaktive Terminal-Shell. Wenn sie dort funktioniert, wird dieselbe Logik in Shell-Skripten angezeigt, daher benötigt " um es zu exportieren. STATT sollten wir einchecken teraktive / Terminalbenutzer mittty -s
odertest -t 0
. - @DouglasDD In der Tat. Der
PS1
-Test wurde beispielsweise seit Ewigkeiten in Debian ' s/etc/profile
durchgeführt. Ich weiß nicht, ' wo diese schlechte Praxis entstanden ist. Ich vermute, dass es von einem bestimmten Anwendungsfall stammt (möglicherweise das Erkennen von Rlogin- oder SSH-Anmeldungen?), Bei dem es zufällig funktioniert hat. Leider schlägt dies in vielen anderen Fällen fehl, daher die vielen Fragen zu diesem Thema hier und anderswo. - @ Gilles sollten wir nicht
CLICOLOR
und entweder? @DouglasDD bedeutet das, dass derif [[-z $p1]];then return fi
Check in meinem.bashrc
fehlerhaft ist?