it-swarm.com.de

Benutzerdefinierte Eingabeaufforderung wird nicht gehalten, wenn eine untergeordnete Bash ausgeführt wird

Ich habe Bash gelernt und dabei mit der .bash_profile - Datei herumgespielt, um Begrüßungsnachrichten usw. einfügen zu können. Später habe ich diese Änderungen einfach entfernt. Aber nachdem ich das getan hatte, ging meine Standardkonfiguration von Prompt verloren: Ursprünglich war die Eingabeaufforderung fett gedruckt und der Teil \w War blau, sodass die Eingabeaufforderung in einem tief verschachtelten Verzeichnis nicht so verwickelt zu sein schien. Ich denke, das war die Standardeinstellung für Ubuntu (korrigiere mich, wenn ich mich irre), aber wie ich schon sagte, ging sie verloren und meine Eingabeaufforderung war nicht fett und monochrom, was zu einem Durcheinander führte, wenn ich mich in Verzeichnissen mit langen Namen befand.

Also habe ich gestern Abend versucht, meine Eingabeaufforderung auf die oben erwähnte Weise anzupassen. Es hat gut funktioniert, nachdem ich den Code zu .bash_profile Hinzugefügt habe.

Code war wie folgt:

export PS1="\[$(tput bold)\]\[email protected]\h:\[$(tput sgr 0)\]\e[1;34m\w$ \e[m"

Wenn ich jedoch versuche, eine andere Bash-Shell in der aktuellen auszuführen, wird die Eingabeaufforderung unformatiert:

Ist das normal? Ist es nicht der springende Punkt, eine Variable zu exportieren, um sie für alle untergeordneten Prozesse zugänglich zu machen, die von dieser Shell aus gesteuert werden? Warum trifft das nicht auf diese Situation zu?

4
etka

TL; DR : Setzen Sie einfach den Aufruf von PS1 in ~/.bashrc oder rufen Sie Subshells mit -l Flagge

Zannas Antwort schlägt angemessen vor, PS1 in ~/.bashrc zu setzen, um von interaktiven Shells beschafft zu werden.

Sie können jedoch das Flag -l verwenden, um die Subshell als Anmeldeshell zu behandeln:

DIR:/xieerqi|04:25|[email protected]:
$ echo "PS1='TEST$ '" > ~/.profile

DIR:/xieerqi|04:25|[email protected]:
$ bash
[email protected]:~$ exit

DIR:/xieerqi|04:25|[email protected]:
$ bash -l
TEST$ 

Das "Warum"

Ist das normal? Ist es nicht der springende Punkt, eine Variable zu exportieren, um sie für alle untergeordneten Prozesse zugänglich zu machen, die von dieser Shell aus gesteuert werden? Warum gilt das nicht für diese Staffelung?

Ja, das ist das erwartete Verhalten. Wenn Sie etwas exportieren, sollten sich Variablen nach unten in Subshells ausbreiten.

[email protected]:~$ export VAR=303
[email protected]:~$ bash
[email protected]:~$ echo $VAR
303
[email protected]:~$ ksh
$ echo $VAR
303

Das Problem ist wieder ~/.bashrc. Die Standarddatei~/.bashrc enthält Zeilen, die PS1 überschreiben. Also, Ihre Variable wurde exportiert, aber dann verwendet einmal interaktive Shell-Quelle ~/.bashrc. Das Beispiel für diese Situation wurde von Gilles 'Antwort auf eine der Fragen unter Unix Stackexchange beobachtet.

Was ~/.profile betrifft, so wird empfohlen, Umgebungsvariablen von dort aus festzulegen und zu exportieren. Dies ist eine häufige Praxis.

Um auf Zannas Kommentar einzugehen, warum die allererste Shell eingefärbt wurde, glaube ich, dass dies die Ursache ist:

Wenn bash als interaktive Login-Shell aufgerufen wird. . . Es liest zuerst Befehle aus der Datei/etc/profile und führt sie aus, falls diese Datei existiert. Nach dem Lesen dieser Datei wird nach ~/.bash_profile, ~/.bash_login und ~/.profile in dieser Reihenfolge gesucht und gelesen und ausgeführt Befehle von dem ersten , der existiert und lesbar ist. (aus der Bash-Manpage, Hervorhebung hinzugefügt)

Nachdem Sie sich angemeldet haben, findet bash~/.bash_profile und gibt es als erste gefundene Datei aus. Bei den anderen Shells handelt es sich um interaktive Shells, bei denen keine Anmeldung erforderlich ist. Anschließend wird nur noch ~/.bashrc bereitgestellt.

5

.bash_profile Wird nur von Login-Shells bezogen. Es wurde bei der Anmeldung in der X-Sitzung bezogen und die Umgebung wurde übernommen, wie @Serg ausführlich erläutert. Irgendwie haben Sie eine Konfiguration verwaltet, in der diese Umgebung nicht durch .bashrc Überschrieben wird, und Ihr Terminal möglicherweise so eingestellt, dass standardmäßig eine Anmeldeshell geöffnet wird. Ich kann das von Ihnen erlebte Verhalten reproduzieren, indem ich mein Terminal wie folgt konfiguriere:

dadurch wird die Shell als Anmelde-Shell geöffnet, aber jedes aufgerufene Kind ist eine Nicht-Anmelde-Shell und liefert .bashrc und nicht .bash_profile, es sei denn, @Serg schlägt vor, das -l Flag wird verwendet.

TL; DR
Wenn Sie möchten, dass die benutzerdefinierte Eingabeaufforderung über interaktive Shells aufgerufen wird, geben Sie den Code in .bashrc Ein.

6
Zanna