2011-08-28 106 views
3

我正在編寫一個Tcl腳本,並且我想要保存腳本的目錄(不是當前的目錄,所以$env(PWD)是不是我想要的)。獲取腳本存在的目錄

這可能嗎?

+2

操作系統偏執。真棒。 –

+0

誰是這個「我們」的蒼白臉? ;-) – TrojanName

+1

當然我們所有的思想正確的人;) –

回答

0

我不是很了TCL(再)來加速

你會拿到劇本的名稱作爲$argv0

我會簡單地套用功能/公用事業realpath隨後dirname得到它的目錄

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 
} 

如果這是主要的應用程序,也可以代替info script使用$::argv0。這不會改變整個代碼的運行(除非你手動設置它)。如果通過相對符號鏈接調用腳本

+0

'file normalize'在那裏,以便您可以安全地使用'cd'命令。如果您從不更改進程當前的工作目錄,則不需要它。 –

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