TCL:如何检查环境变量是否已设置

问题描述 投票:0回答:3

我正在尝试构建一个模块文件,我想包含一个 if 语句来检查是否已设置某些环境变量(例如 PATH、LD_LIBRAY_PATH、PYTHON_PATH...)。

我尝试了几种不同的语法选项(在此处、官方文档和其他论坛搜索之后),但是当我尝试时:

module use modulefiles
module load mymodule

我不断收到

ERROR:102: Tcl command execution failed
错误。以下是我尝试过的一些选项:

我)

set myTools /path/to/my/Tools
if { info exists $LD_LIBRARY_PATH } {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTool/lib64:$LD_LIBRARY_PATH
} else {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTools/lib64
}

ii)

set myTools /path/to/my/Tools
if { [info exists $LD_LIBRARY_PATH] } {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTool/lib64:$LD_LIBRARY_PATH
} else {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTools/lib64
}

iii)

set myTools /path/to/my/Tools
if { $?LD_LIBRARY_PATH } {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTool/lib64:$LD_LIBRARY_PATH
} else {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTools/lib64
}

检查可能已设置的环境变量是否存在的正确语法是什么,例如在

.cshrc
.login
文件中?

如果这是一个基本问题,我深表歉意。我以前在 shell 中做过类似的事情(主要是 csh),但我对 TCL 和构建模块文件很陌生,因此我们将不胜感激任何帮助和建议!

谢谢!

environment-variables tcl environment-modules
3个回答
11
投票

关于 env 的 http://wiki.tcl.tk/1624 可能包含您问题的答案。

按照其他答案中给出的提示和上面给出的维基链接,我构建了以下适合我的代码。

if { [info exists ::env(IDL_PATH)] } {
   if {![string match *<IDL_DEFAULT>* $::env(IDL_PATH)]} {
   puts stderr "Warning: ill defined IDL_PATH environment variable
   }
} else {
setenv  IDL_PATH        "<IDL_DEFAULT>"
}

3
投票

env全局数组也可以用来设置环境变量的值,最好使用::env而不是env从0级访问它(或声明为

global env

set myTools /path/to/my/Tools
if { [info exists ::env(LD_LIBRARY_PATH)] } {
    set ::env(LD_LIBRARY_PATH) $myTools/lib:$myTool/lib64:$env(LD_LIBRARY_PATH)
} else {
    set ::env(LD_LIBRARY_PATH) $myTools/lib:$myTools/lib64
}

2
投票

如果您有实际的错误消息而不是“出了问题”的摘要,这确实很有帮助。

一般来说,环境变量在Tcl中被映射到全局

env
数组的元素中;它们不仅仅成为单独的全局变量(因为这可能会被过度滥用)。另外,当谈论 about 变量时,您不会从中读取内容,因此不要在其前面加上
$
前缀(在 Tcl 中,这严格地 是读取操作)。也就是说,使用
setenv
很重要,因为这是关于操纵调用者中的环境,而不是 Tcl 代码本身。

因此我们在您的第二次尝试中使用了一种变体。

set myTools /path/to/my/Tools
if { [info exists env(LD_LIBRARY_PATH)] } {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTool/lib64:$env(LD_LIBRARY_PATH)
} else {
    setenv LD_LIBRARY_PATH $myTools/lib:$myTools/lib64
}

第一次尝试的问题是您需要使用方括号语法来使用 Tcl 命令的输出。第三个的问题是

$?
对Tcl来说根本没有任何意义(我想我们可以改变这一点,但这将是一条漫长的路要走,而且现在对你没有帮助)。

© www.soinside.com 2019 - 2024. All rights reserved.