我有一个tcl脚本,需要检查脚本中使用的工具的版本和许可证(以及其他内容)。
我可以通过以下方式查看环境变量:
puts $::env(VERSION_PATH)
它将返回与以下相同的值:
# VV Ran outside the script VV
printenv | grep VERSION_PATH
但如果我的代码的比较部分失败,我想给 VERSION_PATH 正确的值。
所以我一直在尝试各种不同的命令来实现这个目标:
set env(VERSION_PATH) /tool/bin/misc_path
set ::env(VERSION_PATH) /tool/bin/misc_path
puts "export VERSION_PATH=/tool/bin/misc_path"
我对linux / shell相当新,所以如果这是无法完成的事情,我只想知道:)
非常感谢任何建议/建议。
谢谢
答案 0 :(得分:3)
您无法按设计设置父进程的环境变量。这本身并不是一个限制,它只是shell和环境变量的工作方式。
答案 1 :(得分:2)
通过从父进程复制将环境变量继承到它创建的每个子进程。子进程无法触及父进程的副本。
这并不意味着它无法完成;它不是可以自动发生的事情。设置父环境变量的最简单方法是,如果父进程需要这个,就是将一个简短的脚本写入子进程的stdout
并得到父级评估子进程返回的内容。
因此,使用这个Tcl脚本:
# Compute this value any way you want
set versionPath /tool/bin/misc_path
puts "export VERSION_PATH=$versionPath"
然后你可以让这个Bash脚本像这样调用它:
eval `tclsh getVersionPath.tcl`
之后,bash代码将具有环境变量。 (这是modules
system如何在某些Unix上运行的核心,即使它没有普遍安装。)
简而言之,只要外部进程期望运行一个子进程来为其提供一个脚本来评估哪个将设置环境,它就可以工作。
(您也可以在Windows上执行相同的操作,但使用的语法略有不同,并且几乎要求您将脚本编写到临时文件并使用CALL theTempFile.bat
。)