Bash-PS1-Variable exportieren oder nicht exportieren

9

Ich habe gerade viel Zeit damit verbracht, mich über Login und interaktive Shells zu informieren und warum man Umgebungsvariablen, Shell-Funktionen usw. in den verschiedenen Profil- und bashrc-Dateien festlegen sollte oder nicht. In diesem Beitrag 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 all den Beispielen, die ich dazu gesehen habe, haben sie so etwas wie export PS1="". Sollte dies wirklich in die Umwelt exportiert werden, da es nur eine Bedeutung für Bash hat? Nur PS1=""in meinem ~ / .bashrc zu haben, erzeugt den beabsichtigten Effekt für mich, aber ich frage mich, ob mir etwas fehlt.

Mike Sweeney
quelle

Antworten:

13

Das ist richtig: PS1ist nur in interaktiven Instanzen von Bash sinnvoll, daher sollte es eingestellt ~/.bashrcund nicht exportiert werden. PS1ist auch in anderen Shells von Bedeutung, hat aber eine andere Bedeutung, da sich die prompten Erweiterungen zwischen den Shells unterscheiden. Tatsächlich kann sogar zwischen Bash-Instanzen PS1unterschiedliche Bedeutungen haben, da die Bedeutung (zumindest promptvars) von den Shell-Optionen abhängt .

Das Exportieren PS1in die Umgebung von .profileist ein Rückfall in die 1970er Jahre, als es nur eine Shell gab, die es verwendete (die Bourne-Shell) und keine Konfigurationsdatei hatte. Es funktioniert auch heute noch, wenn Sie immer dieselbe Shell verwenden und sie niemals anders konfigurieren. Aber alle modernen Schalen , die nicht rein für Skripting ausgelegt sind (csh, ksh, bash, zsh, ...) Lesen Sie eine Konfigurationsdatei , wenn interaktiv (gestartet .cshrc, .kshrc, .bashrc, .zshrc, ...), so dass die 1970er - Methode ist nicht mehr notwendig. Durch Einstellungen PS1und andere Shell-spezifische Einstellungen in einer Shell-spezifischen Datei und nicht durch Exportieren in die Umgebung werden Fehler vermieden, wenn Sie eine andere Shell-Konfiguration oder eine andere Shell oder ein anderes Terminal verwenden, das Ihre übliche Eingabeaufforderung nicht anzeigen kann Raffiniertheit. RahmenPS1in einer Shell-spezifischen Datei funktioniert die ganze Zeit, während das Einrichten .profileund Exportieren nur in „einfachen“ Fällen funktioniert. Es gibt also keinen Grund, es nicht richtig zu machen, aber es gibt viele schlechte Tutorials im Internet und sogar schlechte Standardkonfigurationen in Distributionen. C'est la vie .

Gilles 'SO - hör auf böse zu sein'
quelle
Wie funktioniert der Export PS1von der .profileArbeit für Nicht-Login-Bash-Shells, da sie diese nicht beziehen würden? Wollen Sie damit sagen, dass dies funktionieren würde, weil die Nicht-Login-Shell von einer Login-Shell getrennt würde und somit PS1über die Umgebung erben würde ?
Mike Sweeney
@ MikeSweeney ja, deshalb wird es exportiert .
Muru
Eine Möglichkeit, die falsche Idee beim Exportieren von PS1 zu verbreiten, besteht darin, zu sehen, if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi dass häufig in den .bashrc-Dateien von Personen nur Dinge wie die Befehlsvervollständigung geladen werden, wenn dies die interaktive Terminal-Shell eines Benutzers ist. Wenn es dort funktioniert, wird dieselbe Logik in Shell-Skripten angezeigt, daher muss es "exportiert" werden. STATT sollten wir nach interaktiven / Terminalbenutzern mit tty -soder suchen test -t 0.
DouglasDD
1
@DouglasDD In der Tat. Der PS1Test ist /etc/profilezum Beispiel schon seit Ewigkeiten bei Debian . Ich weiß nicht, wo diese schlechte Praxis entstanden ist. Ich vermute, es kam von einem bestimmten Anwendungsfall (vielleicht Rlogin oder SSH-Logins erkennen?), In dem es zufällig funktioniert hat. Leider scheitert es in vielen anderen Fällen, daher die vielen Fragen zu diesem Thema hier und anderswo.
Gilles 'SO - hör auf böse zu sein'
@ Gilles sollten wir nicht exportieren CLICOLORund auch LS_COLORSnicht? @DouglasDD bedeutet das, dass der if [[-z $p1]];then return fiCheck in meinem .bashrcfehlerhaft ist?
Startec