Given the file you show, you should be able to do:
(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)
If it doesn't work then it is only because you need to format your environment file first. Here's an example:
(set -f ; IFS='
' ; env - $(cat) printenv
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
I at first thought you could do it through the shell - but it will probably set some of its own environment before calling your program. But I can at least demonstrate that the arguments are assigned correctly:
(set -f; IFS='
' ; env - $(cat) sh -c 'echo "$variable3"'
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
value3 an$d s'om\e m"ore
Still, if you would prefer to source it, here's how you can using the shell:
(echo '$1'; cat; echo '$2') <<\ENV |\
env - sh -s -- 'set -a' printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
###OUTPUT###
PWD=/home/mikeserv/test
SHLVL=1
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
_=/usr/bin/printenv
Notice that I removed the $IFS
stuff - that's not necessary this way - but I did have to get specific about the quotes in the file. Here I'm essentially .dot
sourcing stdin
- reading the |pipe
as input - but you can use any file. I use set -a
before reading the input file to set the --allexport
option.
That is a result of using bash
's sh
- it adds $PWD
, $SHLVL
and $_
. With dash
it is a little better. And dash
doesn't add a bunch of exports either, so you can specify the -a
parameter on the command line:
(cat; echo '$1') <<\ENV |\
env - dash -sa -- printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
PWD=/home/mikeserv/test
Only $PWD
comes through.
Best Answer
You shouldn't have environment variable definitions in
~/.bashrc
, that file is for configurations for bash when running interactively (aliases, prompts, that kind of stuff). The place for environment variables is~/.profile
; it's read when you start an interactive session in text mode, and on many systems also in graphics mode. See this answer for more details.To run a bash shell that sets your environment variables as usual for the remote machine, you can do
For other shells, make them read your
.profile
(and perhaps/etc/profile
as well):If you want to copy environment variables from your local session over ssh, that's possible but usually disabled on the server side. Read this answer for more details.