Ich habe ein Shell-Skript, um einige Umgebungsvariablen einzurichten und jedes Programm zu starten, das ich als Argument einsende:
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 bash
Beispiel zum Aufrufen verwende , 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 , um einen Terminal zu nennen ( xterm
, aterm
, ...) mein LD_LIBRARY_PATH
bekommt 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_PATH
wird in keiner der Bash-Startdateien angezeigt (außer .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
linux
terminal
shell
environment-variables
kjfletch
quelle
quelle
Antworten:
Die Terminal-Binärdatei
setgid
gruppiert sich am wahrscheinlichstenutmp
. Setuid- und Setgid-Binärdateien werdenLD_LIBRARY_PATH
aus Sicherheitsgründen deaktiviert. sieheld.so(8)
:quelle
Überprüfen Sie im Terminal (xterm, aterm usw.), wie die Shell aufgerufen wurde: Eine Login-Shell zeigt "-bash" und eine Nicht-Login-Shell zeigt "bash" an, wenn Sie aufrufen
echo $0
.Eine Login-Bash-Shell liest die folgende Reihenfolge:
Überprüfen Sie, ob eine dieser Dateien vorhanden ist und ob sie die Variable zurücksetzen. Sie müssen auch alle Dateien befolgen, die diese Dateien enthalten.
Wenn bash nicht als Login-Shell aufgerufen wird, werden die folgenden Dateien weiterhin gelesen, wenn festgestellt wird, dass es sich um eine interaktive Shell handelt.
Eine einfache Möglichkeit, die Art der aufgerufenen Bash-Shell zu bestimmen, besteht darin, Ihr .bash_profile und .bashrc zu definieren und "Login-Shell" bzw. "Interactive-Shell" zu wiederholen.
Sobald Sie die Art der aufgerufenen Shell kennen, können Sie Ihr Skript zur Datei .bashrc oder .bash_profile in Ihrem Home-Verzeichnis hinzufügen. Alternativ können Sie das Zurücksetzen von LD_LIBRARY_PATH deaktivieren.
Beachten Sie, dass Sie Ihr Skript möglicherweise außerhalb davon aufrufen müssen, wenn Ihr .bashrc- oder .bash_profile durch einen ähnlichen Schutz wie den folgenden geschützt ist:
Solche Schutzvorrichtungen werden normalerweise platziert, um zu verhindern, dass ein Skript in einer Sitzung mehrmals bezogen wird.
Bearbeiten: Wenn sich herausstellt, dass es mühsam ist, festzustellen, wo die Variable zurückgesetzt wird, und Sie beispielsweise Zugriff auf / etc / profile oder /etc/bash.bashrc haben, können Sie vorübergehend "set -x" am oberen Rand der hinzufügen Skript, um alle Befehle anzuzeigen, die ausgeführt werden. Die Ausgabe ist ziemlich ausführlich, also machen Sie zuerst ein "set -x" in Ihrer Shell und führen Sie einige Befehle aus, damit Sie wissen, was Sie erwartet.
quelle
set -x
Debug-Option verwenden, um einen Speicherauszug von allem zu erhalten, was ab dem Zeitpunkt der Erstellung der Shell ausgeführt wird.set -x
Speicherauszug verweist nicht auf LD_LIBRARY_PATH. Phantom nicht gesetzt.bash verwendet je nach Start unterschiedliche Startskripte. Es gibt sieben verschiedene Möglichkeiten, um es zu starten, aber die wichtigsten sind Login-Shells im Vergleich zu interaktiven Shells ohne Login.
Weitere Informationen finden Sie im Bash-Handbuch . Ich würde vermuten, dass das / etc / profile oder das ~ / .bash_profile etwas unternimmt, um die Variable LD_LIBRARY_PATH zurückzusetzen.
Bearbeiten: Ich denke, Sie haben alles getan, um zu zeigen, dass bash kein Startskript hat, das LD_LIBRARY_PATH deaktiviert. Es ist Zeit, die großen Waffen herauszubringen.
Der folgende Befehl zeigt die gesamte Umgebung an, wenn jeder Prozess gestartet wird, von Bash bis Xterm, und alles andere, was damit zu tun hat. Sie erhalten wahrscheinlich eine große Menge an Ausgabe. Daher ist es eine gute Idee, die Ausgabe in einer Datei zu speichern .
Jetzt zeigt die Datei strace_output.txt jeden Systemaufruf Ihres Skripts und jeden untergeordneten Prozess an, und Sie können sehen, welcher Prozess zuletzt LD_LIBRARY_PATH hatte, bevor er entfernt wurde.
quelle
(Diese Frage ist sehr alt, aber ich bin gerade auf das gleiche Problem gestoßen und dokumentiere die Lösung für die Nachwelt :)
Ich hatte dieses Problem mit dem GNU-Bildschirm (dem Terminal-Multiplexer), aber es kann auch mit einem normalen Terminal passieren. Teddy hatte in meinem Fall recht, Bildschirm hat Setguid gesetzt.
Meine Lösung bestand darin, LD_LIBRARY_PATH vor der Ausführung zu speichern und anschließend wiederherzustellen. Also habe ich einen Wrapper ~ / bin / screen erstellt (~ / bin auf PATH setzen) mit folgendem Inhalt:
und machte es dann ausführbar mit
chmod +x ~/bin/screen
. Möglicherweise müssen Sie eine neue Shell öffnen, damit sie den Wrapper aufnimmt.Dann habe ich folgendes zu ~ / .bashrc hinzugefügt. Denken Sie daran, dass ~ / .bashrc bei jedem Start von bash bezogen wird, im Gegensatz zu ~ / .bash_profile, das nur beim Anmelden (normalerweise beim Start oder beim Anmelden über ssh) bezogen wird.
Jetzt sollte screen (oder aterm, xterm, ... ersetzen Sie es einfach oben) $ LD_LIBRARY_PATH wie gewünscht beibehalten.
quelle
LD_LIBRARY_PATH
in.screenrc
(anstelle von.bashrc
) wiederherstellen :setenv LD_LIBRARY_PATH "$PRESERVE_LD_LIBRARY_PATH"
gefolgt vonunsetenv PRESERVE_LD_LIBRARY_PATH
Anscheinend haben Sie eine .bashrc-Datei (oder eine gleichwertige Datei) in Ihrem Home-Verzeichnis, die diese Variable definiert. Ich weiß allerdings nicht viel mehr Details.
Bearbeiten Ok, da das Starten von Bash funktioniert, schätze ich nicht die .bashrc. Aber vielleicht eine andere Konfigurationsdatei, die zufällig auf die gleiche Weise ausgeführt wird, wenn Sie xterm oder aterm starten.
quelle
Die meisten Fenstersysteme erstellen den Anmeldevorgang neu, wenn sie ein Terminalfenster starten, hauptsächlich weil das Terminalfenster das untergeordnete Element des Fenstermanagers und nicht die Startshell wird.
Fügen Sie es also in Ihr .bash_profile oder .bashrc ein, wenn es in einem neuen Fenster angezeigt werden soll.
Eine andere Alternative besteht darin, xterm (zum Beispiel) ein Argument zum Ausführen eines Startskripts zu übergeben. Beenden Sie nicht am Ende dieses Skripts ....
quelle