How should I export http_proxy variable? - bash

I'm trying to write a simple script that will set proxy settings. Actually I just need to export http_proxy ftp_proxy https_proxy ... variables with export command.
But it's not working when I run it manually from the shell because export affect only current shell and subshells, but no others. Also I don't want to call it from .bashrc because it's not my default proxy settings.
So how should I export http_proxy variable to make effect globally?

Back in the day I was also sick of setting and then unsetting the proxy settings after my work was done. I always wished if there was a command simple command to do the set and unset function for me.
Then I figured that if I create a new function in my .bashrc I can call it from the command line by using the bash-tab-completion. Saves even more time.
This is what I did:
$ vi ~/.bashrc
function setproxy() {
export {http,https,ftp}_proxy='http://proxy-serv:8080'
}
function unsetproxy() {
unset {http,https,ftp}_proxy
}
$ . ~/.bashrc
Now I just do:
$ setproxy
or
$ setp<TAB> and <ENTER>
and it sets the proxy for me. Hope this helps.

Instead of doing this in a script, make this a function. You can declare this function in your .bashrc:
function set_custom_proxy() {
export http_proxy='http://myproxy:3128'
}
Then run this in the current shell:
echo $http_proxy
set_custom_proxy
echo $http_proxy
It works as a variable modification in a function is not local to the function.
EDIT:
FYI: to use a local variable in a function, you need to use the local keyword:
atest="Hello World"
btest="Hello World2"
function my_func() {
local atest;
atest="Hello World3"
btest="Hello World4"
echo $atest
echo $btest
}
echo $atest
echo $btest
my_func
echo $atest
echo $btest

Since you can't access .bashrc, you can use source command which will run in the current shell's context and all the variables you set will be available.
source ./script

If you don't want to modify the .bashrc file run your script with .
. script.sh

Related

How do I make a bash script interactive midway?

#!/bin/bash
testfunc()
{
# test function
}
testvar="test"
# some setup
bash # I get a shell here but with no access to testfunc and testvar
# some cleanup
This script stops and opens a shell, and I can exit to continue execution. However the environment is not preserved, so I can't call the functions, variables etc. set by the script and vice versa. How do I get a shell in a way that does?
You can use export
#!/bin/bash
testfunc()
{
# test function
}
testvar="test"
# some setup
export -f testfunc
export testvar
bash
# some cleanup

Environmental variables are not reloading properly

I really don't know how this could happen. So suppose I added the following line to my ~/.bashrc file: export asd='asd'
if I now save and reload the terminal: exec bash and I check for the value, it exists:
$ echo $asd
asd
All fine and jolly, but when I delete this value, when I remove the line export asd='asd', and create a new bash instance, the value persists.
I can modify the value just fine..
global variables are passed to child processes.
[~] export asd='Hello World'
[~] sh
#sh-5.1$ echo $asd
Hello World
Doesn't matter if you remove that command from bashrc as long it is set in your enviroment, instead you will need to remove that global variable first. You can list all active global variables with env or printenv of your active bash-session.
[~] export asd='Hello World'
[~] env | grep asd
asd=Hello World
[~] unset asd
[~] sh
#sh-5.1$ echo $asd
Alternative you can start a new shell without invoking it from the previous shell. This way it will read your profile and bashrc only and not transfer any environment variables that are created/active for the (sub)shell you were using.

Simple Bash Script Error and Advice - Saving Environment Variables in Linux

I am working on a project that is hosted in Heroku. The app is hard coded to use Amazon S3 and looks for the keys in environment variables. This is what I wrote after looking at some examples and I am not sure why its not working.
echo $1
if [ $1 != "unset" ]; then
echo "set"
export AMAZON_ACCESS_KEY_ID=XXXXXXXXXXXX
export AMAZON_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export S3_BUCKET_NAME=XXXXXXXXX
else
echo "unset"
export AMAZON_ACCESS_KEY_ID=''
export AMAZON_SECRET_ACCESS_KEY=''
export S3_BUCKET_NAME=''
fi
When running the script it goes to the set section. But when inspecting through echo $AMAZON_ACCESS_KEY_ID # => ''.
I am not sure what is causing the issue. I will be interested in...
A fix for this...
A way to extract and add heroku config variables in the the env in an easier way.
You need to source the script, not run it as a child. If you run the script directly, its environment disappears when it ends. Sourcing the script causes it to be executed in the current environment. help source for more information.
Example:
$ VAR=old_value
$ cat script.sh
#!/bin/bash
export VAR=new_value
$ ./script.sh
$ echo $VAR
old_value
$ source script.sh
$ echo $VAR
new_value
Scripts executed with source don't need to be executable nor do they need the "shebang" line (#!/bin/bash) because they are not run as separate processes. In fact, it is probably a good idea to not make them executable in order to avoid them being run as commands, since that won't work as expected.

Reset / Reloading bash, completely (alias and function)

I want to reset the shell, as I log out / log in, reloading aliases, functions, from scratch.
But don't talk about source ~/.bashrc nor . ~/.bashrc !
Why ? Because source or . just enrich the current shell, with new function(s), alias(es), and so on.
FYI, you can put this function in your bashrc :
function foo {
echo "foo";
}
Then do source ~/.bashrc or . ~/.bashrc. Yeah, foo is working. Then now, edityour .bashrc, and replace foo by bar, to have :
function bar {
echo "bar";
}
You can now type foo, and saw that the function foo is still working, despite of it doesn't exist anymore in the .bashrc file. That's the point I wanted to show.
I tryed exec bash;, but it doesn'nt load the .bashrc file. And exec bash;source ~/.bashrc; obviously doesn't work, because exec kill the current process (source is never called).
as OP wish
bash --login
NB: if you're running bash inside a terminal (xterm or alike), you need also to provide the -ls parameter (or equivalent) to the terminal. (e.g. xterm -ls )
Write the following script:
while true; do
bash
if [ $? -ne 123 ]; then
break
fi
done
Set the executable bit and set it as your shell.
Then add an alias in your ~/.bashrc:
alias resetterm="exit 123"
This requires just one extra bash process running all the time. Each time you reset, a new bash will run, and the old process will end.

How to write a bash script to set global environment variable?

Recently I wrote a script which sets an environment variable, take a look:
#!/bin/bash
echo "Pass a path:"
read path
echo $path
defaultPath=/home/$(whoami)/Desktop
if [ -n "$path" ]; then
export my_var=$path
else
echo "Path is empty! Exporting default path ..."
export my_var=$defaultPath
fi
echo "Exported path: $my_var"
It works just great but the problem is that my_var is available just locally, I mean in console window where I ran the script.
How to write a script which allow me to export global environment variable which can be seen everywhere?
Just run your shell script preceded by "." (dot space).
This causes the script to run the instructions in the original shell. Thus the variables still exist after the script finish
Ex:
cat setmyvar.sh
export myvar=exists
. ./setmyvar.sh
echo $myvar
exists
Each and every shell has its own environment. There's no Universal environment that will magically appear in all console windows. An environment variable created in one shell cannot be accessed in another shell.
It's even more restrictive. If one shell spawns a subshell, that subshell has access to the parent's environment variables, but if that subshell creates an environment variable, it's not accessible in the parent shell.
If all of your shells need access to the same set of variables, you can create a startup file that will set them for you. This is done in BASH via the $HOME/.bash_profile file (or through $HOME/.profile if $HOME/.bash_profile doesn't exist) or through $HOME/.bashrc. Other shells have their own set of startup files. One is used for logins, and one is used for shells spawned without logins (and, as with bash, a third for non-interactive shells). See the manpage to learn exactly what startup scripts are used and what order they're executed).
You can try using shared memory, but I believe that only works while processes are running, so even if you figured out a way to set a piece of shared memory, it would go away as soon as that command is finished. (I've rarely used shared memory except for named pipes). Otherwise, there's really no way to set an environment variable in one shell and have another shell automatically pick it up. You can try using named pipes or writing that environment variable to a file for other shells to pick it up.
Imagine the problems that could happen if someone could change the environment of one shell without my knowledge.
Actually I found an way to achieve this (which in my case was to use a bash script to set a number of security credentials)
I just call bash from inside the script and the spawned shell now has the export values
export API_USERNAME=abc
export API_PASSWORD=bbbb
bash
now calling the file using ~/.app-x-setup.sh will give me an interactive shell with those environment values setup
The following were extracted from 2nd paragraph from David W.'s answer: "If one shell spawns a subshell, that subshell has access to the parent's environment variables, but if that subshell creates an environment variable, it's not accessible in the parent shell."
In case a user need to let parent shell access your new environment variables, just issue the following command in parent shell:
source <your_subshell_script>
or using shortcut
. <your_subshell_script>
You got to add the variable in your .profile located in /home/$USER/.profile
Yo can do that with this command:
echo 'TEST="hi"' >> $HOME/.profile
Or by edit the file with emacs, for example.
If you want to set this variable for all users, you got to edit /etc/profile (root)
There is no global environment, really, in UNIX.
Each process has an environment, originally inherited from the parent, but it is local to the process after the initial creation.
You can only modify your own, unless you go digging around in the process using a debugger.
write it to a temporary file, lets say ~/.myglobalvar and read it from anywhere
echo "$myglobal" > ~/.myglobalvar
Environment variables are always "local" to process execution the export command allow to set environment variables for sub processes. You can look at .bashrc to set environment variables at the start of a bash shell. What you are trying to do seems not possible as a process cannot modify (or access ?) to environment variables of another process.
You can update the ~/.bashrc or ~/.bash_profile file which is used to initialize the environment.
Take a look at the loading behavior of your shell (explained in the manpage, usually referring to .XXXshrc or .profile). Some configuration files are loaded at login time of an interactive shell, some are loaded each time you run a shell. Placing your variable in the latter might result in the behavior you want, e.g. always having the variable set using that distinct shell (for example bash).
If you need to dynamically set and reference environment variables in shell scripts, there is a work around. Judge for yourself whether is worth doing, but here it is.
The strategy involves having a 'set' script which dynamically writes a 'load' script, which has code to set and export an environment variable. The 'load' script is then executed periodically by other scripts which need to reference the variable. BTW, the same strategy could be done by writing and reading a file instead of a variable.
Here's a quick example...
Set_Load_PROCESSING_SIGNAL.sh
#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
echo "#!/bin/bash" > $PROCESSING_SIGNAL_SCRIPT
echo "export PROCESSING_SIGNAL=$1" >> $PROCESSING_SIGNAL_SCRIPT
chmod ug+rwx $PROCESSING_SIGNAL_SCRIPT
Load_PROCESSING_SIGNAL.sh (this gets dynamically created when the above is run)
#!/bin/bash
export PROCESSING_SIGNAL=1
You can test this with
Test_PROCESSING_SIGNAL.sh
#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
N=1
LIM=100
while [ $N -le $LIM ]
do
# DO WHATEVER LOOP PROCESSING IS NEEDED
echo "N = $N"
sleep 5
N=$(( $N + 1 ))
# CHECK PROCESSING_SIGNAL
source $PROCESSING_SIGNAL_SCRIPT
if [[ $PROCESSING_SIGNAL -eq 0 ]]; then
# Write log info indicating that the signal to stop processing was detected
# Write out all relevent info
# Send an alert email of this too
# Then exit
echo "Detected PROCESSING_SIGNAL for all stop. Exiting..."
exit 1
fi
done
~/.bin/SOURCED/lazy script to save and load data as flat files for system.
[ ! -d ~/.megadata ] && mkdir ~/.megadata
function save_data {
[ -z "$1" -o -z "$2" ] && echo 'save_data [:id:] [:data:]' && return
local overwrite=${3-false}
[ "$overwrite" = 'true' ] && echo "$2" > ~/.megadata/$1 && return
[ ! -f ~/.megadata/$1 ] && echo "$2" > ~/.megadata/$1 || echo ID TAKEN set third param to true to overwrite
}
save_data computer engine
cat ~/.megadata/computer
save_data computer engine
save_data computer megaengine true
function get_data {
[ -z "$1" -o -f $1 ] && echo 'get_data [:id:]' && return
[ -f ~/.megadata/$1 ] && cat ~/.megadata/$1 || echo ID NOT FOUND
:
}
get_data computer
get_data computer
Maybe a little off topic, but when you really need it to set it temporarily to execute some script and ended up here looking for answers:
If you need to run a script with certain environment variables that you don't need to keep after execution you could do something like this:
#!/usr/bin/env sh
export XDEBUG_SESSION=$(hostname);echo "running with xdebug: $XDEBUG_SESSION";$#
In my example I just use XDEBUG_SESSION with a hostname, but you can use multiple variables. Keep them separated with a semi-colon. Execution as follows (assuming you called the script debug.sh and placed it in the same directory as your php script):
$ debug.sh php yourscript.php

Resources