我正在编写一个Tcl脚本,我想获取保存脚本的目录(而不是当前目录,所以$env(PWD)
不是我想要的)。
这个有可能吗?
我正在编写一个Tcl脚本,我想获取保存脚本的目录(而不是当前目录,所以$env(PWD)
不是我想要的)。
这个有可能吗?
当脚本直接执行时,您可以使用:
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
。在代码运行期间,它不会改变(除非您手动设置它)。
file normalize
的存在是为了您可以安全地使用cd
命令。如果您从不更改进程的当前工作目录,则不需要它。 - Donal Fellowsfile normalize [file dirname [info script]]
如果通过相对符号链接调用脚本,则可能无法可靠地工作。我使用这个方法来减轻可能出现的问题:
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]]
}
我对tcl(不再)很熟悉
你可以通过$argv0
获取脚本名称
我会简单地应用函数/实用程序realpath
,然后跟随dirname
来获取它的目录