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
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.
You can add a . command extension to your text script. Then use chmod 744 to make it executable. When opened or double-clicked in the Finder it will then run from the Terminal.
bashrc file is a hidden script file containing various terminal session configurations. The file executes automatically in both interactive and non-interactive non-login shells.
So if the desktop will be available at /mnt/c/users/<username>/desktop. Type Bash in run prompt, and it will launch the distro prompt. Navigate to the folder using “cd” command to the folder where the scripts are available. Type “sh script.sh” and hit Enter.
Ctrl-D : indicates the end of a file or stream of characters that you are entering on the command line.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With