shell set理解


 

在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM