问题
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:
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";
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
- Now update your .bashrc file to set the variable
export TESTVAR=test_this_variable
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.
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
来源:https://stackoverflow.com/questions/4477328/bashrc-not-read-when-shell-script-is-invoked-from-desktop-shortcut