获取脚本所在的目录

3

我正在编写一个Tcl脚本,我想获取保存脚本的目录(而不是当前目录,所以$env(PWD)不是我想要的)。

这个有可能吗?


这个“我们”是谁,白脸?;-) - TrojanName
1
当然,我们这些正直的人都是这样想的 ;) - Tom Zych
@Tom Zych 哈哈!我认为这是同样的“我们”,无论是在这里还是在维基百科上,当他们不同意我的时候。从来没有“我不同意”;而是“我们不同意你”。孤独的游侠 - TrojanName
嗯,在我的情况下,我是开玩笑的(在最后一条评论中;我认真地称呼目录为目录,而不是“文件夹”)。 - Tom Zych
4个回答

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。在代码运行期间,它不会改变(除非您手动设置它)。


file normalize的存在是为了您可以安全地使用cd命令。如果您从不更改进程的当前工作目录,则不需要它。 - Donal Fellows

2

0
file 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]]
}

0

我对tcl(不再)很熟悉

你可以通过$argv0获取脚本名称

我会简单地应用函数/实用程序realpath,然后跟随dirname来获取它的目录


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接