开发者

Exporting variables between shell script

开发者 https://www.devze.com 2023-02-25 06:46 出处:网络
I have two in开发者_开发问答dependently running scripts. first one lets say script A calculates some values. And i want to echo these values from other script called B. These scripts will not call eac

I have two in开发者_开发问答dependently running scripts. first one lets say script A calculates some values. And i want to echo these values from other script called B. These scripts will not call each other. I have used export keyword but didn't work. How can i do this?


If I understood the requirement then can't both scripts be simply executed in same sub shell, independently but without calling each other or without any need of an external file or pipe like this:

Let's say this is your script1.sh

#!/bin/bash
# script1.sh: do something and finally
export x=19

And here us your script2.sh

#!/bin/bash
# script2.sh: read value of $x here
echo "x="${x}

Just call them in same sub-shell like this

(. ./script1.sh && ./script2.sh)

OUTPUT:

x=19


 mkfifo /tmp/channel

 process_a.sh > /tmp/channel&
 process_b.sh < /tmp/channel&

 wait

Of course you can also just read a single line when you want it.

In bash there are coprocs, which also might be what you want. Random example from this page

# let the output of the coprocess go to stdout
{ coproc mycoproc { awk '{print "foo" $0;fflush()}' ;} >&3 ;} 3>&1
echo bar >&${mycoproc[1]}
foobar

ksh has a similar feature, apparently


Think of each script as a function: function A calculates some value and returns it. It does not know who will call it. Function B takes in some value and echo it. It does not care who produced that value. So, script A is:

#!/bin/sh
# a.sh: Calculate something and return the result
echo 19

and script B is:

#!/bin/sh
# b.sh: Consume the calculated result, which passed in as $1
echo The result is $1

Make them executable:

chmod +x [ab].sh

Now, we can glue them together on the command line:

$ b.sh $(a.sh)
The result is 19

Semantically, b.sh did not call a.sh. You called a.sh and passed its result to b.sh.


Can't you read a third file, let's say settings.sh with the common exported variables?

# common.sh
export MY_PATH=/home/foo/bar/
export VERSION=42.2a

and in both A and B source common.sh to load those values.

Note that the export may not be required in that case.


You may echo values to files, then the other script may read them. If you want to use it as a parameter for something, use reverse aposthrophe:

echo `cat storedvalue`

Be careful, if the two scripts are running at the same time, concurrency problems may occur, which can cause rarely appearing, mystic-looking errors.


Actually all your need is source you can skip the export prefix.

My use-case was an environment specific settings file, example:

Within main_script.sh

THIS_DIR=`dirname $0`
source $THIS_DIR/config_vars.sh
# other commands

Within config_vars.sh

LOCAL_ROOT="$HOME/folder/folder"
REMOTE_USERNAME='someuser'
BACKUP_FOLDER="$LOCAL_ROOT/folder"
# etc.
0

精彩评论

暂无评论...
验证码 换一张
取 消