代码之家  ›  专栏  ›  技术社区  ›  Seth G.

导出环境变量bash

  •  1
  • Seth G.  · 技术社区  · 6 年前

    这是我编写用来测试的脚本,假设这个脚本是由其他程序运行的,并且可以访问env变量。

    echo $STATE
    if [[ $STATE == "public" ]]; then
        echo foo
        export STATE='private'
    elif [[ $STATE == "private" ]]; then
        echo bar
        export STATE='public'
    fi
    echo $STATE
    

    我想要的结果是

    $ ./test.sh
    public
    foo
    private
    $ ./test.sh
    private
    bar
    public
    

    但实际产出是

    $ ./test.sh
    public
    foo
    private
    $ ./test.sh
    public
    foo
    private
    

    看来 export

    1 回复  |  直到 6 年前
        1
  •  0
  •   Kurtis Rader    6 年前

    脚本作为当前shell的子脚本运行。子进程不能直接修改其父进程的环境。其中包括环境变量、当前工作目录、如何处理信号等。进程只能修改其环境,并且隐式地修改其启动的任何进程的环境。

    这个 export 你的剧本写得很好。但它只修改该脚本或它生成的任何子进程(例如,其他脚本)的值。根据定义,它不能更改其父进程中的值。

    解决方案1:将脚本实现为shell函数。由于函数在当前shell的上下文中运行,因此它们可以修改其状态,包括其env vars。

    解决方案2:存储 STATE 值在用户主目录中的某个位置,如点文件。