Tcl 如何获得类似bash的环境变量值?

Tcl 如何获得类似bash的环境变量值?,tcl,Tcl,有这样一个字符串:set mystring“$ENV\u NAME/c/a/b/c” 如何获得完整路径 要获取完整路径,您需要使用文件连接。要访问环境变量,您需要访问全局env数组: set fullPath [file join $env(ENV_NAME) c a b c] 如果ENV_NAME=/usr/bin,则上面的命令将返回完整路径,作为/usr/bin/c/a/b/c。您将在Windows平台上获得类似的结果。不幸的是,您的问题不是很清楚 您说您有字符串set mystring“

有这样一个字符串:
set mystring“$ENV\u NAME/c/a/b/c”


如何获得完整路径

要获取完整路径,您需要使用
文件连接
。要访问环境变量,您需要访问全局
env
数组:

set fullPath [file join $env(ENV_NAME) c a b c]

如果
ENV_NAME=/usr/bin
,则上面的命令将返回
完整路径
,作为
/usr/bin/c/a/b/c
。您将在Windows平台上获得类似的结果。

不幸的是,您的问题不是很清楚

您说您有字符串
set mystring“$ENV_NAME/c/a/b/c”
,这可能意味着这是用户提供的输入,也可能是程序/Tcl脚本的一部分

  • 如果这确实是用户提供的输入,我建议您使用
    eval

    proc substEnv {input} {
        set __ENV [array get ::env]
        dict with __ENV {}
        eval $input
    }
    puts [substEnv {set mystring "$ENV_NAME/c/a/b/c"}]
    
    如果您可以信任用户,这很好,否则我建议使用。请注意,安全解释器无权访问
    ::env
    数组,因此必须将其内容传递给安全解释器

  • 但是,如果这是您程序的一部分,我建议您使用
    文件连接

    set path [file join $::env(ENV_NAME) c a b c]
    
    file join
    处理类似于
    $::env(env_NAME)
    是根目录(
    /
    在*nix上或
    C:\
    在windows上,两者都以路径分隔符作为特例结束)


最好使用
set\uu ENV[array get::ENV];使用uu ENV{return[subst-nobackslashes-nocommands$input]}的dict
不完全正确。他想要这条路,这条路只是最后一部分。当然,
subst[lindex$input end]
也可以这样做。