有一个这样的字符串:set mystring "$ENV_NAME/c/a/b/c"
如何获得完整路径?
要获得完整路径,您需要使用file join
. 要访问环境变量,您需要访问全局env
数组:
set fullPath [file join $env(ENV_NAME) c a b c]
如果ENV_NAME=/usr/bin
,则上述内容将返回fullPath
为/usr/bin/c/a/b/c
。在 Windows 平台上你会得到类似的结果。
不幸的是,你的问题不是很清楚。
你说你有 string 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
数组,因此您必须将其内容传递给安全解释器。
但如果这是你程序的一部分,我建议你file join
改用
set path [file join $::env(ENV_NAME) c a b c]
file join
处理诸如$::env(ENV_NAME)
根目录之类的事情(/
在 *nix 或C:\
windows 上,它们都以路径分隔符结尾作为特殊情况)