.bashrc not read when shell script is invoked from

2019-01-23 19:17发布

问题:

I have a simple problem understanding a behavior in linux. In short, on linux if i invoke my sh script from a 'Desktop Shortcut' then the script cannot see the latest environment variables (set in bashrc). So i was wondering that in what scope is this shell script located ?

To create a testcase and reproduce:

  1. Create a simple shell script 'testme.sh' :

    !/bin/sh
    echo "Hi This is a test script checking the env var";
    echo "TESTVAR = $TESTVAR";
    read in
    echo "Done";
    
  2. create a desktop shortcut for the script above.

     
    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. Now update your .bashrc file to set the variable
   export TESTVAR=test_this_variable
   
  1. Open a brand new terminal and execute the script using it's complete path like '~/testme.sh' //This can see the value for variable 'TESTVAR' from the .bashrc file.

  2. Now, simply double click and execute the Desktop shortcut. //This should open a terminal and print out value for 'TESTVAR' as blank. //So my question is, who is the parent for the terminal opened by this shortcut?

I've tried this on RHL. Im looking for a solution or a w/a for this problem, hope someone can help soon.

Thanks, Abhishek.

回答1:

See the INVOCATION section of the bash manpage. Here is an excerpt

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

Long story short, if you want non-interactive shell's to have certain ENV vars set, then put them in ~/.bash_profile instead of ~/.bashrc