我正在编写一个Tcl脚本,我想获取保存脚本的目录(不当前目录,所以$env(PWD)
不是我想要的。)< / p>
这可能吗?
答案 0 :(得分:4)
当脚本直接执行时,您使用:
set theDir [file normalize [file dirname [info script]]]
此必须在脚本的顶层或namespace eval
内部运行(出于技术原因,您应使用variable
代替set
。特别是,它不应放在过程中并稍后调用,因为到那时info script
调用将返回其他内容。因此,典型的包实现脚本可能如下所示:
namespace eval ::samplePackage {
variable theDir [file normalize [file dirname [info script]]]
source $theDir/foo.tcl
source $theDir/bar.tcl
load $theDir/grill[info sharedlibextension]
package provide samplePackage 1.0
}
如果这是主应用程序,您也可以使用$::argv0
代替info script
。在整个代码运行期间不会改变(除非你手动设置它)。
答案 1 :(得分:2)
答案 2 :(得分:0)
我对tcl(不再)的速度不太高兴了
您将脚本名称设为$argv0
我只是应用函数/实用程序realpath
后跟dirname
来获取它的目录
答案 3 :(得分:0)
file normalize [file dirname [info script]]
如果通过 relative 符号链接调用脚本,将无法可靠地工作。我用它来缓解可能出现的问题:
proc script_dir {} {
set r [info script]
if {![catch {file link $r} symlink]} {
set r [file join [file dirname $r] $symlink]
}
return [file dirname [file normalize $r]]
}