Получить каталог, в котором существует скрипт - PullRequest
3 голосов
/ 28 августа 2011

Я пишу сценарий Tcl и хочу получить каталог, в котором сохранен сценарий ( Не текущий каталог, поэтому $env(PWD) - это не то, что мне нужно).

Это возможно?

Ответы [ 4 ]

4 голосов
/ 28 августа 2011

Когда скрипт выполняется напрямую, вы используете:

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. Это не изменится во время выполнения вашего кода (если вы не установите его вручную).

2 голосов
/ 28 августа 2011

Использовать информационный скрипт в сочетании с имя файла

0 голосов
/ 25 августа 2013
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 голосов
/ 28 августа 2011

Я не очень разбираюсь в скорости с tcl (больше)

Вы получите имя сценария как $argv0

Я бы просто применил функции / утилиты realpath, а затем dirname, чтобы получить каталог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...