Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
800 views
in Technique[技术] by (71.8m points)

linux - .bashrc not read when shell script is invoked from desktop shortcut

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...