Ändern Sie $TERMINFO im Bashrc-Skript

Ändern Sie $TERMINFO im Bashrc-Skript

Ich versuche, dies TERMINFO="$HOME/.terminfo"in meinem .bashrcSkript einzustellen. Der Grund dafür ist, dass sich mein Terminal nicht am Systemstandort befindet terminfound ich die terminfoDatei daher in meinem Home-Verzeichnis habe.
Das Problem hierbei ist, dass die Änderung nicht für die aktuelle Shell wirksam wird, sondern nur für Subshells. Ich vermute, es liegt daran, dass readline initialisiert wird, bevor bash die .bashrcDatei liest.

Gibt es also eine Möglichkeit, dieses Problem zu lösen? Vielleicht eine Möglichkeit, Readline neu zu initialisieren, damit die Änderungen $TERMINFOwirksam werden?
Ich versuche, ein „ exec bashAfter Setting“ zu vermeiden, da ich dann sicherstellen muss, dass ich nicht in einer erneuten Ausführungsschleife lande, und das ist einfach hässlich (obwohl es funktioniert, exec bashes nach dem Setzen auszuführen).

EDIT: Dies istnichtein Problem beim Ausführen des Skripts. Ich weiß, dass das .bashrcSkript ausgeführt wird und dass es $TERMINFOeingestellt wird. Wenn es ausgeführt wird echo $TERMINFO, nachdem die Shell fertig gestartet ist, wird der korrekte Wert angezeigt.

EDIT2: Es scheint, dass dies mit der Version der Bash- oder Readline-Bibliothek zusammenhängt. Ich kann das Problem mit Bash-4.2.20 und Readline-6.2_p1 nicht reproduzieren, aber mit Bash-3.2 und Readline-5.1.3 schon.

„Nein“ ist eine akzeptable Antwort, wenn es nicht möglich ist. Aber es wäre schön zu wissen, was los ist, das dazu führt, dass die Antwort „Nein“ lautet.

Antwort1

Nachdem ich also noch ein bisschen herumgestöbert hatte, fand ich heraus, was los war. Die Bash-Version von RHEL5 verwendet überhaupt kein Terminfo (warum, wer weiß, es ist Red Hat), sondern Termcap. Es gibt jedoch anscheinend eine andere Bash auf der Box, die Terminfo verwendet. Aus diesem Grund würden Subshells und erneute Ausführungen funktionieren, da sie die andere Bash verwenden würden, nicht die Standard-Bash. Ich fühle mich dumm, weil ich das nicht bemerkt habe.

Dies kann durch den Vergleich zweier Befehle ermittelt werden:

# ldd "$BASH"
    linux-vdso.so.1 =>  (0x00007fff4f1fd000)
    libtermcap.so.2 => /lib64/libtermcap.so.2 (0x0000003e0bc00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)

# ldd `which bash`
    linux-vdso.so.1 =>  (0x00007fff643fd000)
    libncurses.so.5 => /usr/lib64/libncurses.so.5 (0x0000003e0d800000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)

Beachten Sie, dass einer mit libtermcap und der andere mit libncurses verknüpft ist.

Ich hätte hier angeben sollen, dass ich RHEL verwende, da dies anscheinend der kritische Faktor ist. Warum sie Termcap verwenden, wenn so ziemlich alle anderen auf der Welt es aufgegeben haben, ergibt keinen Sinn, aber so ist es nun einmal.

Antwort2

Aus man bashdem Aufrufabschnitt:

Wenn bash als interaktive Login-Shell oder als nicht-interaktive Shell mit der Option --login aufgerufen wird, liest und führt es zuerst Befehle aus der Datei /etc/profile aus, sofern diese Datei vorhanden ist. Nach dem Lesen dieser Datei sucht es in dieser Reihenfolge nach ~/.bash_profile, ~/.bash_login und ~/.profile und liest und führt Befehle aus der ersten Datei aus, die vorhanden und lesbar ist.

Um Ihre Umgebung einzurichten, schließen Sie die terminfoZeile (und alle anderen Umgebungsvariablen, die Sie festlegen möchten) entweder in .bash_profileoder ein .profile.

Sieh dir das anSuperuser-Antwort für weitere Details.

Antwort3

Bash liest nur .bashrc, wenn es gestartet wird.

Sie müssen source ~/.bashrces daher in der aktuellen Sitzung erneut laden.

verwandte Informationen