码迷,mamicode.com
首页 > 系统相关 > 详细

shell set理解

时间:2016-07-22 19:01:18      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

 

在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

shell set理解

标签:

原文地址:http://www.cnblogs.com/superhedantou/p/5696219.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!