• 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

  • 相关阅读:
    webp实践的javascript检测方案
    码农不算程序员 :)
    解决 phpmyadmin #2002 无法登录 MySQL 服务器
    xmlhttprequest upload
    shape-outside 矩形之外的另一种思路
    百度搜索词&淘宝搜索词 接口实现
    Sublime Text 2 破解 on Mac
    利用a标签自动解析URL
    rc4加密解密
    国内的一些前端框架
  • 原文地址:https://www.cnblogs.com/superhedantou/p/5696219.html
Copyright © 2020-2023  润新知