我正在编写一个gradle脚本,它通过执行shell脚本(在gradle中)来设置环境变量。脚本运行正常,但我从未看到它将结果写入系统环境变量。
摇篮:
def executeOnShell() {
String command = "export key=value"
return executeOnShell(command, new File(System.properties.'user.dir'))
}
private def executeOnShell(String command, File workingDir) {
println command
def process = new ProcessBuilder(addShellPrefix(command))
.directory(workingDir)
.redirectErrorStream(true)
.start()
process.inputStream.eachLine {println it}
process.waitFor();
return process.exitValue()
}
private def addShellPrefix(String command) {
commandArray = new String[3]
commandArray[0] = "sh"
commandArray[1] = "-c"
commandArray[2] = command
return commandArray
}
当我在shell上运行env命令时,它不显示在系统环境变量中写入的任何内容。有人可以指出我做错了什么,我该如何解决?
注意:我使用的是Mac,所以它是一个终端。编写env应返回所有环境变量。
谢谢!
答案 0 :(得分:2)
问题是您正在尝试通过执行脚本来设置环境变量。如果我正确理解你的描述,甚至还有两个脚本,首先是gradle脚本然后是shell脚本。
流程的环境变量只能由流程本身(在正常条件下)更改。当您执行另一个进程时,该新进程只能更改自己的环境变量,而不能更改它的父进程或任何其他进程。
因此,在您的情况下,您执行gradle脚本,该脚本执行添加环境变量的shell脚本(shell命令)。该变量被添加到graddle进程内的shell进程的环境中,但不会添加到graddle进程的环境中。当shell进程终止然后gradle进程终止时,你将留下一个环境未改变的shell。
你想要达到什么目的?您是否希望在shell中设置变量以供进一步使用?然后使用source
(或等效,如果你的shell不是bash)。您是否希望在gradle过程中设置环境变量?然后查看gradle的文档,了解如何设置环境变量。
另请参阅:the difference between sourcing and executing,它解释了为什么由执行脚本设置的环境变量不会粘在父进程中。