Скопировать имя файла (с подстановочным знаком) в tcl

Я пытаюсь скопировать файл с помощью подстановочного знака, и он неправильно интерпретируется.

set projName [lindex $argv 0]
puts "$projName chosen"

set sysdefPath "$projName/$projName.runs/impl_1/*.sysdef"
file copy -force $sysdefPath ./src/generatedFiles/$projName.hdf

Я пробовал несколько вариантов этого, но ни один из них не работал {*}, (*), [*], {.*}. В результате подстановочный знак (*) помещается в путь поиска вместо того, чтобы пытаться сопоставить его с образцом.

Как правильно это сделать?

Выход,

$ test.tcl -tclargs proj
# set projName [lindex $argv 0]
# puts "$projName chosen"
proj chosen
# set sysdefPath "$projName/$projName.runs/impl_1/*.sysdef"
# file copy -force $sysdefPath ./src/generatedFiles/$projName.hdf
error copying "proj/proj.runs/impl_1/*.sysdef": no such file or directory
    while executing
"file copy -force $sysdefPath ./src/generatedFiles/$projName.hdf"
    (file "./src/projTcls/build_bitstream.tcl" line 5)

person gutelfuldead    schedule 18.09.2018    source источник


Ответы (1)


Ваша оболочка будет расширять шаблоны файлов везде, где найдет их. Tcl не такой: вы должны явно запрашивать список файлов, соответствующих шаблону, используя glob: не проверено

set pattern $projName/$projName.runs/impl_1/*.sysdef
set sysdefPaths [glob -nocomplain -- $pattern]
switch -exact [llength $sysdefPaths] {
    0 {error "No files match $pattern"}
    1 {file copy -force [lindex $sysdefPaths 0] ./src/generatedFiles/$projName.hdf}
    default {error "Multiple files match $pattern: [list $sysdefPaths]"}
}
person glenn jackman    schedule 18.09.2018
comment
Ветвь 0 коммутатора никогда не будет достигнута, если вы не добавите флаг -nocomplain в команду glob. - person Schelte Bron; 18.09.2018