dan*_*nvk 6 c bash shell environment-variables
我有两个shell脚本,我想从C程序调用.我希望在第一个脚本中设置的shell变量在第二个脚本中可见.这是它的样子:
灰:
var=blah
<save vars>
Run Code Online (Sandbox Code Playgroud)
b.sh:
<restore vars>
echo $var
Run Code Online (Sandbox Code Playgroud)
到目前为止,我提出的最好的是"set>/tmp/vars"的变体来保存变量,"eval $(cat/tmp/vars)"来恢复它们.当它试图恢复只读变量时,"eval"会窒息,所以我需要把它们弄出来.可以通过"declare -r"获得这些变量的列表.但是有一些变量没有出现在这个列表中,但仍然无法在eval中设置,例如BASH_ARGC.所以我也需要把它们弄出来.
在这一点上,我的解决方案感觉非常脆弱且容易出错,而且我不确定它是多么便携.有一个更好的方法吗?
避免设置有问题的变量的一种方法是仅存储在每个脚本执行期间已更改的变量。例如,
灰:
set > /tmp/pre
foo=bar
set > /tmp/post
grep -v -F -f/tmp/pre /tmp/post > /tmp/vars
Run Code Online (Sandbox Code Playgroud)
b.sh:
eval $(cat /tmp/vars)
echo $foo
Run Code Online (Sandbox Code Playgroud)
/ tmp / vars包含以下内容:
PIPESTATUS=([0]="0")
_=
foo=bar
Run Code Online (Sandbox Code Playgroud)
明显地逃避前两行没有不利影响。
如果 a.sh 可以调用 b.sh,则在导出它们时它将继续存在。或者让父母设置所有必要的值,然后调用两者。这是我能想到的最安全、最可靠的方法了。
不确定它是否被接受的教条,但是:
bash -c 'export foo=bar; env > xxxx'
env `cat xxxx` otherscript.sh
Run Code Online (Sandbox Code Playgroud)
其他脚本会将 env 打印为 xxxx ...
更新:
另请注意:
man execle
Run Code Online (Sandbox Code Playgroud)
关于如何从 C 内部为另一个系统调用设置环境变量(如果需要的话)。和:
man getenv
Run Code Online (Sandbox Code Playgroud)
和http://www.crasseux.com/books/ctutorial/Environment-variables.html