Warum wird mein LD_LIBRARY_PATH-Startterminal nicht gesetzt?

13534
kjfletch

Ich habe ein Shell-Skript, um einige Umgebungsvariablen einzurichten und das Programm, das ich als Argument einschicke, zu starten:

export PATH=$HOME/local/bin:$PATH export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH export TESTER="MY TEST VAR"  $@ 

Wenn ich dies zum bashBeispiel benutze, funktioniert es:

kjfletch@flatbed:~$ envrun.sh bash kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH /home/kjfletch/local/lib: kjfletch@flatbed:~$ echo $TESTER MY TEST VAR 

Wenn ich es verwenden, ein Terminal zu nennen ( xterm, aterm, ...) mein LD_LIBRARY_PATHbekommt ungesetzt:

kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH  kjfletch@flatbed:~$ echo $TESTER  MY TEST VAR 

Warum passiert das? Wie kann ich das aufhalten? (Ich verwende Debian 5.0)

Aktualisieren

Mein Terminal ruft bash nicht als Login auf:

kjfletch@flatbed:~$ echo $0 bash 

My LD_LIBRARY_PATHwird in keiner der bash-Startdateien angezeigt (abgesehen von .bash_history und ~ / .profile ist nicht vorhanden.):

kjfletch@flatbed:~$ grep "LD" ~/.bash* kjfletch@flatbed:~$ grep "LD" /etc/bash.bashrc  kjfletch@flatbed:~$ grep "LD" /etc/profile  
8
Gibt es eine dieser Startdateien, die den "source" -Befehl oder das "." Befehl, um andere Startskripte zu holen? Wenn ja, kann einer davon der Täter sein. Kevin Panko vor 15 Jahren 0
Beantwortet Ihre Frage nicht, aber die * wirklich * gute Sache wäre, die * Notwendigkeit * für LD_LIBRARY_PATH zu beseitigen (Gründe: [1] (http://xahlee.info/UnixResource_dir/_/ldpath.html) [2 ] (http://linuxmafia.com/faq/Admin/ld-lib-path.html) [3] (http://www.prefetch.net/articles/linkers.badldlibrary.html)). Sie können beispielsweise /etc/ld.so.conf bearbeiten oder die benutzerdefinierten Bibliotheken in ~ / local so kompilieren, dass sie * wissen *, wo sie ihre Bibliotheken finden (siehe die Links, die ich gegeben habe). DevSolar vor 12 Jahren 0

6 Antworten auf die Frage

9
Teddy

Das binäre Terminal ist am wahrscheinlichsten setgidzu gruppieren utmp. Setuid- und Setgid-Binärdateien werden LD_LIBRARY_PATHaus Sicherheitsgründen nicht gesetzt. sehen ld.so(8):

Die erforderlichen gemeinsam genutzten Bibliotheken, die das Programm benötigt, werden in der folgenden Reihenfolge gesucht

  • Verwendung der Umgebungsvariablen LD_LIBRARY_PATH( LD_AOUT_LIBRARY_PATHfür a.out-Programme). Außer wenn die ausführbare Datei eine setuid / setgid-Binärdatei ist, wird sie in diesem Fall ignoriert.
4
Kevin Panko

bash verwendet verschiedene Startskripte, je nachdem, wie es gestartet wird. Es gibt sieben verschiedene Möglichkeiten, um es zu starten, aber die wichtigsten sind Login-Shells gegenüber nicht-Login-interaktiven Shells.

Weitere Informationen finden Sie im Bash-Handbuch . Ich würde vermuten, dass / etc / profile oder das ~ / .bash_profile die LD_LIBRARY_PATH-Variable zurücksetzen.


Edit: Ich denke, Sie haben alles getan, um zu zeigen, dass Bash kein Startskript enthält, das LD_LIBRARY_PATH löscht. Es ist Zeit, die großen Geschütze herauszubringen.

Der folgende Befehl zeigt die gesamte Umgebung an, wenn die einzelnen Prozesse gestartet werden, von bash bis xterm, und alles, was sonst noch involviert ist - Sie erhalten wahrscheinlich eine große Menge an Ausgaben. Das Speichern der Ausgabe in einer Datei ist daher eine gute Idee .

strace -v -f -e trace=process -o strace_output.txt envrun.sh xterm 

Nun zeigt die Datei strace_output.txt jeden Systemaufruf an, der von Ihrem Skript und jedem untergeordneten Prozess ausgeführt wird, und Sie können sehen, welcher Prozess der letzte war, der LD_LIBRARY_PATH hatte, bevor er entfernt wurde.

4
nagul

Überprüfen Sie im Terminal (xterm, aterm usw.), wie die Shell aufgerufen wurde: Eine Login-Shell zeigt "-bash" und eine Nicht-Login-Shell zeigt beim Aufruf "Bash" an echo $0.

$ echo $0 -bash $ bash $ echo $0 bash 

Eine Login-Bash-Shell liest der Reihe nach Folgendes:

  1. / etc / profile
  2. ~ / .bash_profile
  3. ~ / .bash_login
  4. ~ / .profile

Prüfen Sie, ob eine dieser Dateien vorhanden ist und ob sie die Variable zurücksetzen. Sie müssen auch den Dateien folgen, die diese Dateien enthalten.

Wenn bash nicht als Login-Shell aufgerufen wird, werden die folgenden Dateien immer noch gelesen, wenn festgestellt wird, dass es sich um eine interaktive Shell handelt.

  1. /etc/bash.bashrc
  2. ~ / .bashrc

Eine einfache Methode zum Bestimmen der Art der Bash-Shell ist das Definieren von .bash_profile und .bashrc sowie das Echo "Login-Shell" bzw. "Interactive-Shell".

Sobald Sie wissen, welche Art von Shell aufgerufen wird, haben Sie die Möglichkeit, Ihr Skript der Datei .bashrc oder .bash_profile in Ihrem Ausgangsverzeichnis hinzuzufügen. Alternativ können Sie das Zurücksetzen von LD_LIBRARY_PATH deaktivieren.

Wenn Ihr .bashrc oder .bash_profile durch einen Wächter ähnlich dem unten stehenden geschützt wird, müssen Sie möglicherweise Ihr Skript außerhalb aufrufen:

if [ "X$BASH_SOURCED" != "XYES" ]; then export BASH_SOURCED=YES  fi 

Solche Wachen werden normalerweise so platziert, dass verhindert wird, dass ein Skript mehrmals in einer Sitzung verwendet wird.

Bearbeiten: Wenn sich herausstellt, ob Tedius ermittelt, wo die Variable zurückgesetzt wird, und Sie beispielsweise Zugriff auf / etc / profile oder /etc/bash.bashrc haben, können Sie "set -x" am oberen Rand des Befehls vorübergehend hinzufügen Skript, um alle Befehle anzuzeigen, die ausgeführt werden. Die Ausgabe wird ziemlich ausführlich sein, also führen Sie zuerst ein "set -x" in Ihrer Shell aus und führen Sie einige Befehle aus, damit Sie wissen, was Sie erwartet.

+1 Danke für die Info. Ich habe mein OP als Antwort auf Ihre Antwort aktualisiert. kjfletch vor 15 Jahren 0
Sehen Sie dasselbe Verhalten, wenn Sie eine neue Bash-Shell auf demselben Terminal eingeben, indem Sie Bash eingeben? Übrigens müssen Sie auch Dateien überprüfen, die innerhalb von /etc/bash.bashrc und / etc / profile aufgerufen werden - eine der Einstellungen kann die Variable aufheben. Alternativ können Sie die Debug-Option `set -x` verwenden, um eine Sicherungskopie aller Aktivitäten ab dem Zeitpunkt der Shell-Erstellung zu erhalten. nagul vor 15 Jahren 0
Der `set -x`-Dump verweist nicht auf LD_LIBRARY_PATH. Phantom unset kjfletch vor 15 Jahren 0
2
jdm

(Diese Frage ist sehr alt, aber ich bin gerade auf das gleiche Problem gestoßen und dokumentiere die Lösung für die Nachrangigkeit :)

Ich hatte dieses Problem mit dem GNU-Bildschirm (dem Terminal-Multiplexer), aber es kann auch bei einem normalen Terminal vorkommen. Teddy hatte in meinem Fall recht, Bildschirm hat Setguid gesetzt.

$ ls -l /usr/bin/screen -rwxr-sr-x 1 root 84 361016 Mar 30 2011 /usr/bin/screen ^ 

Meine Lösung bestand darin, LD_LIBRARY_PATH vor der Ausführung zu speichern und danach wiederherzustellen. Also habe ich einen Wrapper ~ / bin / screen (put / / bin auf PATH) mit folgendem Inhalt erstellt:

#!/bin/bash  # somehow, screen resets LD_LIBRARY_PATH. # save it here, and restore it in .bashrc export PRESERVE_LD_LIBRARY_PATH="$LD_LIBRARY_PATH" /usr/bin/screen "$@" 

und machte es dann mit ausführbar chmod +x ~/bin/screen. Möglicherweise müssen Sie eine neue Shell öffnen, damit der Wrapper aufgenommen werden kann.

Dann habe ich zu ~ / .bashrc folgendes hinzugefügt. Denken Sie daran, dass ~ / .bashrc bei jedem Start von bash abgerufen wird, im Gegensatz zu ~ / .bash_profile, das nur beim Login (normalerweise beim Start oder bei der Anmeldung über ssh) abgerufen wird.

if [[ "$PRESERVE_LD_LIBRARY_PATH" != "" ]]; then export LD_LIBRARY_PATH="$PRESERVE_LD_LIBRARY_PATH" #echo "restored LD_LIBRARY_PATH" export -n PRESERVE_LD_LIBRARY_PATH fi 

Jetzt sollte screen (oder aterm, xterm, ... einfach oben ersetzen) $ LD_LIBRARY_PATH wie gewünscht beibehalten.

Sie können `LD_LIBRARY_PATH` auch in` .screenrc` (anstelle von `.bashrc`) wiederherstellen:` setenv LD_LIBRARY_PATH "$ PRESERVE_LD_LIBRARY_PATH" `gefolgt von` unsetenv PRESERVE_LD_LIBRARY_PATH` nandhp vor 11 Jahren 0
0
Gnoupi

Es scheint, als hätten Sie eine .bashrc (oder gleichwertige) Datei in Ihrem Home-Verzeichnis, die diese Variable definiert. Ich weiß jedoch nicht viel mehr Details.

Bearbeiten Ok, seit dem Start von bash funktioniert, vermute ich nicht die .bashrc. Möglicherweise jedoch eine andere Konfigurationsdatei, die auf dieselbe Weise ausgeführt wird, wenn Sie xterm oder aterm starten.

Das war mein ursprünglicher Gedanke. Nach langem Suchen gibt es nichts zu finden. Ich habe den Vorteil eines sehr sauberen (NEUEN) $ HOME. kjfletch vor 15 Jahren 0
0
kmarsh

Die meisten Fenstersysteme erstellen den Anmeldeprozess neu, wenn sie ein Terminalfenster starten. Dies ist hauptsächlich darauf zurückzuführen, dass das Terminalfenster zum untergeordneten Element des Fenstermanagers und nicht zur Starthülle wird.

Fügen Sie es in Ihr .bash_profile oder .bashrc ein, wenn Sie möchten, dass es in einem neuen Fenster angezeigt wird.

Eine andere Alternative ist, xterm (zum Beispiel) ein Argument zu übergeben, um ein Startskript auszuführen. Beenden Sie das Skript nicht am Ende.

Ich werde darauf zurückgreifen müssen, denke ich. Ich werde meine Umgebungsvariablen wahrscheinlich in beiden .xinitrc-Quellen beziehen, so dass mein Fenstermanager sie enthält, und in .bashrc, damit meine Terminalfenster sie haben. kjfletch vor 15 Jahren 0