zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》
    YOLO(v1)
    循环赛日程表问题(分治法)
    平面最接近点对问题(分治法)
    SQLite学习心得
    如何找到Linux下常用命令的源码
    WiFi安全之WPA介绍
    七种不良的工作习惯
    Git 技巧小结
    微信智能硬件平台 简介
  • 原文地址:https://www.cnblogs.com/superhedantou/p/5696219.html
Copyright © 2011-2022 走看看