【问题标题】:How to export an env variable from a shell script to current shell instance using MAKEFILE如何使用 MAKEFILE 将环境变量从 shell 脚本导出到当前 shell 实例
【发布时间】:2020-07-08 17:37:25
【问题描述】:

在我的 makefile 中,我想通过 .PHONY 语句调用一个 shell 脚本。在我的 shell 脚本中,我正在导出一个变量并期望它在当前的 shell 实例中被导出。使目标运行正常,但变量未反映在当前 shell 中。

生成文件

$ cat Makefile 
.PHONY: configure-mytest-path
configure-mytest-path:
        . ./scripts/test.sh

我通过 make 目标使用的 Shell 脚本

$ cat scripts/test.sh 
#!/bin/bash
set -x

export MYTESTPATH=/Users/myname/go/mytestpath

检查变量值

$ echo $MYTESTPATH

运行目标

$ make configure-mytest-path
. ./scripts/test.sh
++ export MYTESTPATH=/Users/myname/go/mytestpath
++ MYTESTPATH=/Users/myname/go/mytestpath

检查变量值。

$ echo $MYTESTPATH

我期待 echo $MYTESTPATH 应该打印 /Users/myname/go/mytestpath 但它打印空白。我错过了什么吗?或者这不是将变量导出到当前 shell 实例的方式?

感谢理解

【问题讨论】:

    标签: linux shell makefile gnu


    【解决方案1】:

    不可能做你想做的。

    进程的环境由其父进程创建并交给它。一旦子进程启动,它的环境就完全是它自己的了。它不能被其父级修改,也不能被它创建的任何子级修改。子级将拥有自己的环境副本并且可以更改这些副本,但它们对父级没有影响。

    在你的 makefile 中,你有 3 个进程:你的 shell(你正在输入 make 的地方),它启动 make 程序,然后 make 将启动一个新的 shell 来运行配方。

    第三个程序根本无法修改第一个程序的环境。它甚至不能修改第二个程序(make)的环境。

    修改第一个程序(你的 shell)环境的唯一方法是在那个程序中使用. ./scripts/test.sh(而不是运行make) .

    如果你运行./scripts/test.sh 那么它也不会工作:这将运行一个新的shell,新的shell 将运行该脚本并设置环境变量,然后新的shell 将退出并且你的第一个shell 仍然不会改变了它的环境。

    . 命令是一个特殊的 shell 命令,意思是:不要启动一个新的 shell 来运行这个 shell 脚本;而是在当前 shell 中运行文件中包含的命令,就像您在 shell 提示符下键入它们一样。

    在 bash 中,您可以使用 source 作为 . 的别名并输入 source ./scripts/test.h,因为有些人觉得更容易理解:它们的意思是一样的。

    您也可以创建一个 shell 函数或 shell 别名来执行此操作,因为它们也在同一个 shell 进程中运行,而不是在子进程中。

    但是,没有办法通过 makefile 或运行 make 来完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多