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, um PS1 ü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 mit tty -s oder test -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 der if [[-z $p1]];then return fi Check in meinem .bashrc fehlerhaft ist?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.