在spark bin下面load-spark-env.sh腳本里,有以下語句:
if [ -f "${user_conf_dir}/spark-env.sh" ]; then # Promote all variable declarations to environment (exported) variables set -a . "${user_conf_dir}/spark-env.sh" set +a fi
對set -a不是很了解,所以做了以下小試驗。
有兩個shell腳本,test.sh如下:
#!/usr/bin/env bash set -a SPARK_HOME=aaaa set +a STORM_HOME=cccc echo $SPARK_HOME echo $STORM_HOME ./test2.sh echo $SPARK_HOME echo $STORM_HOME
test2.sh如下:
#!/usr/bin/env bash echo $SPARK_HOME echo $STORM_HOME SPARK_HOME=ddd STORM_HOME=EEE
運行test.sh結果如下:
aaaa cccc aaaa aaaa cccc
可以看到set -a中的SPARK_HOME能夠在另外一個bash中訪問。其實這就是set -a意義所在,它將當前變量導出,使得其他的bash中運行的腳本也能夠訪問改變量,但是與export不同的是只能訪問,不能修改。
另外如果不用set -a,其實可以通過子shell也可以訪問,而不修改,但是這樣做使得所有父shell中的變量都能夠被子shell訪問到,不能做到有范圍的控制。
即如果把test.sh修改如下:
#!/usr/bin/env bash set -a SPARK_HOME=aaaa set +a STORM_HOME=cccc echo $SPARK_HOME echo $STORM_HOME (. ./test2.sh) echo $SPARK_HOME echo $STORM_HOME
輸出結果如下:
aaaa cccc aaaa cccc aaaa cccc
小結:其實shell中的門道還是很多的,只是作為一個腳本,平時不怎么重視,碰到不懂得,多試驗一下就好了。
參考文獻:http://stackoverflow.com/questions/9772036/pass-all-variables-from-one-shellscript-to-another