2010-12-18 22 views
7

Tengo un problema simple para entender un comportamiento en Linux. En resumen, en linux si invoco mi script sh desde un 'Acceso directo de escritorio', entonces el script no puede ver las últimas variables de entorno (establecidas en bashrc). Entonces me preguntaba ¿en qué ámbito se encuentra este script de shell?.bashrc no se lee cuando se invoca script de shell desde el acceso directo de escritorio

Para crear un caso de prueba y se reproducen:

  1. crear un sencillo script de shell 'testme.sh':

     
    !/bin/sh 
    echo "Hi This is a test script checking the env var"; 
    echo "TESTVAR = $TESTVAR"; 
    read in 
    echo "Done"; 
    
  2. crear un acceso directo de escritorio para el script anterior.

     
    cd ~/Desktop 
    vi mytest-desktop.desktop 
    
    
    //Contents for mytest-desktop.desktop are : 
    [Desktop Entry] 
    Version=1.0 
    Type=Application 
    Name=TestAbhishek 
    Exec=/home/abhishek/test/hello.sh 
    Terminal=true 
    
  3. Ahora actualizar su archivo .bashrc para establecer la variable
 
    export TESTVAR=test_this_variable 
  1. abierto una nueva terminal y ejecutar la secuencia de comandos con su ruta completa como '~/testme.sh' // Esto puede ver el valor de la variable 'TESTVAR' del archivo .bashrc.

  2. Ahora, simplemente haga doble clic y ejecute el atajo de Escritorio. // Esto debería abrir un terminal e imprimir el valor de 'TESTVAR' como en blanco. // Entonces mi pregunta es, ¿quién es el padre de la terminal abierta por este atajo?

He intentado con RHL. Estoy buscando una solución o un w/a para este problema, espero que alguien pueda ayudar pronto.

Gracias, Abhishek.

Respuesta

11

Ver la sección INVOCATION de la página de manual de bash. He aquí un extracto

Cuando bash se llama como un shell interactivo inicio de sesión, o como shell no interactivo con la opción --login, que primero lee y ejecuta órdenes del fichero/etc/perfil, si ese archivo existe. Después de leer ese archivo, busca ~/.bash_profile, ~/.bash_login, y ~/.profile, en el que orden, y lee y ejecuta órdenes desde la primera que existe y es legible . La opción --noprofile puede usarse cuando el shell se inicia en inhibe este comportamiento.

Cuando sale un shell de inicio de sesión, bash lee y ejecuta comandos desde el archivo ~/.bash_logout, si existe.

Cuando un shell interactivo que no es se inicia un shell de entrada, bash lee y ejecuta órdenes desde ~/.bashrc, si existe ese archivo. Esto puede ser inhibido al usar la opción --norc. La opción --rcfile file forzará bash para leer y ejecutar los comandos del archivo en lugar de ~/.bashrc.

Para resumir, si quieres caparazón de no interactivo para tener ciertas ENV vars establecido, entonces los pusieron en ~/.bash_profile en lugar de ~/.bashrc

Cuestiones relacionadas