Tengo un script de shell para configurar algunas variables de entorno y ejecutar cualquier programa que envíe como argumento:
export PATH=$HOME/local/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
export TESTER="MY TEST VAR"
$@
Cuando uso esto para llamar, bash
por ejemplo, funciona:
kjfletch@flatbed:~$ envrun.sh bash
kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH
/home/kjfletch/local/lib:
kjfletch@flatbed:~$ echo $TESTER
MY TEST VAR
Cuando lo uso para llamar a un terminal ( xterm
, aterm
, ...) mi LD_LIBRARY_PATH
consigue desarmar:
kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH
kjfletch@flatbed:~$ echo $TESTER
MY TEST VAR
¿Por qué pasó esto? ¿Cómo puedo detener esto? (Estoy ejecutando Debian 5.0)
Actualizar
Mi terminal no está llamando a bash como inicio de sesión:
kjfletch@flatbed:~$ echo $0
bash
Mi LD_LIBRARY_PATH
no aparece en ninguno de los archivos de inicio de bash (aparte de .bash_history y ~ / .profile no existe):
kjfletch@flatbed:~$ grep "LD" ~/.bash*
kjfletch@flatbed:~$ grep "LD" /etc/bash.bashrc
kjfletch@flatbed:~$ grep "LD" /etc/profile
linux
terminal
shell
environment-variables
kjfletch
fuente
fuente
Respuestas:
El terminal binario es más probable
setgid
que se agrupeutmp
. Los binarios setuid y setgid no están configuradosLD_LIBRARY_PATH
por razones de seguridad; verld.so(8)
:fuente
En el terminal (xterm, aterm, etc.), verifique cómo se invocó el shell: un shell de inicio de sesión mostrará "-bash" y un shell sin inicio de sesión mostrará "bash" cuando llame
echo $0
.Un shell bash de inicio de sesión leerá lo siguiente en orden:
Compruebe si existe alguno de estos archivos y si restablecen la variable. También tendrá que seguir cualquier archivo que estos archivos incluyan.
Si bash no se invoca como un shell de inicio de sesión, seguirá leyendo los archivos a continuación si se determina que es un shell interactivo.
Una manera simple de determinar el tipo de shell bash que se invoca es definir su .bash_profile y .bashrc, y hacer eco de "Shell de inicio de sesión" y "Shell interactivo" respectivamente.
Una vez que sepa el tipo de shell que se invoca, tiene la opción de agregar su script al archivo .bashrc o .bash_profile en su directorio de inicio. Alternativamente, puede deshabilitar el restablecimiento de LD_LIBRARY_PATH.
Tenga en cuenta que si su .bashrc o .bash_profile está protegido por una protección similar a la siguiente, es posible que deba llamar a su script fuera de él:
Tales guardias normalmente se colocan para evitar que un script se obtenga varias veces en una sesión.
Editar: si está demostrando que tedius puede rastrear dónde se restablece la variable, y tiene acceso a / etc / profile o /etc/bash.bashrc, por ejemplo, puede agregar temporalmente "set -x" cerca de la parte superior del script para ver todos los comandos que se ejecutan. El resultado será bastante detallado, así que primero haga un "set -x" en su shell y ejecute algunos comandos para que sepa qué esperar.
fuente
set -x
opción de depuración para obtener un volcado de todo lo que se hace desde el momento en que se crea el shell.set -x
volcado no hace referencia a LD_LIBRARY_PATH. Fantasma desarmado.bash usará diferentes scripts de inicio dependiendo de cómo se inicie. Hay siete formas diferentes de iniciarlo, pero las más importantes son las shells de inicio de sesión versus las shells interactivas sin inicio de sesión.
Consulte el manual de bash para más detalles. Sospecharía que / etc / profile o ~ / .bash_profile está haciendo algo para restablecer la variable LD_LIBRARY_PATH.
Editar: creo que ha hecho todo lo posible para mostrar que bash no tiene ningún script de inicio que desarme LD_LIBRARY_PATH. Es hora de sacar las armas grandes.
El siguiente comando mostrará todo el entorno a medida que se inicia cada proceso, desde bash hasta xterm, y cualquier otra cosa que esté involucrada; probablemente obtendrá una gran cantidad de salida, por lo que es una buena idea guardar la salida en un archivo .
Ahora, el archivo strace_output.txt mostrará cada llamada al sistema realizada por su script y cada proceso secundario, y podrá ver qué proceso fue el último en tener LD_LIBRARY_PATH antes de que se elimine.
fuente
(Esta pregunta es muy antigua, pero acabo de encontrar el mismo problema y estoy documentando la solución para la posterioridad :)
He tenido este problema con la pantalla GNU (el multiplexor de terminal), pero también puede ocurrir con un terminal normal. Teddy tenía razón en mi caso, la pantalla se ha establecido.
Mi solución fue guardar LD_LIBRARY_PATH antes de la ejecución y restaurarlo después. Así que creé un contenedor ~ / bin / screen (poner ~ / bin en PATH), con el siguiente contenido:
y luego lo hizo ejecutable con
chmod +x ~/bin/screen
. Puede que tenga que abrir un nuevo shell para que recoja el contenedor.Luego agregué lo siguiente a ~ / .bashrc. Recuerde que ~ / .bashrc se obtiene cada vez que inicia bash, a diferencia de ~ / .bash_profile, que solo se obtiene al iniciar sesión (generalmente al inicio o cuando inicia sesión a través de ssh).
Ahora la pantalla (o aterm, xterm, ... solo sustitúyala arriba) debería conservar $ LD_LIBRARY_PATH como lo desee.
fuente
LD_LIBRARY_PATH
en.screenrc
( en lugar de.bashrc
):setenv LD_LIBRARY_PATH "$PRESERVE_LD_LIBRARY_PATH"
seguido deunsetenv PRESERVE_LD_LIBRARY_PATH
Parece que tiene algún archivo .bashrc (o equivalente) en su directorio de inicio que define esta variable. Sin embargo, no sé muchos más detalles.
Editar Ok, ya que comenzar bash funciona, supongo que no es el .bashrc. Pero tal vez algún otro archivo de configuración que se ejecute de la misma manera, cuando inicie xterm o aterm.
fuente
La mayoría de los sistemas de ventanas recrean el proceso de inicio de sesión cuando inician una ventana de terminal, principalmente porque la ventana de terminal se convierte en el elemento secundario del administrador de ventanas, no en el shell de inicio.
Por lo tanto, póngalo en su .bash_profile o .bashrc si desea que aparezca en una nueva ventana.
Otra alternativa es entregar a xterm (por ejemplo) un argumento para ejecutar un script de inicio. No salgas al final de ese script ...
fuente