Необходимо обработать несколько файлов в TCL

#append #tcl #cat

#добавить #tcl #cat

Вопрос:

Я хочу подключить или объединить 2 файла вместе. Что лучше использовать exec cat или append?

Ниже приведен мой сценарий cat, но, похоже, он не работает.

 set infile [open "$dir/1.txt" w ]

puts $infile "set a 1"
puts $infile "set b 2"

exec /bin/cat "$dir/1.txt $dir2/ABC1.sh" > final.sh

close $infile
 

Комментарии:

1. Я бы ожидал увидеть ошибку «файл не найден» от cat с "$dir/1.txt $dir2/ABC1.sh" кавычками в виде одного слова.

Ответ №1:

Бьюсь об заклад, «похоже, не работает» означает, что вы видите только содержимое $dir2/ABC1.sh in final.sh (или, возможно, видите часть того, что вы пишете $fir1/1.txt , а не все данные). Если это так, вы сталкиваетесь с проблемами буферизации, пытаясь прочитать $dir/1.txt перед закрытием или сбросом infile , как вы. Данные еще не были записаны в базовый файл.

Для объединения нескольких файлов в один, вместо того, чтобы полагаться на внешнюю программу, например cat (могут быть проблемы с тем, как вы цитируете аргументы exec , тоже …), Я бы использовал различные процедуры из модуля fileutil из tcllib, чтобы сделать это в чистом виде tcl :

 package require fileutil
fileutil::writeFile final.sh [fileutil::cat -- $dir/1.txt $dir2/ABC1.sh]
 

Если у вас большие файлы и вы не хотите хранить их все в памяти (или не хотите / не можете установить tcllib), chan copy также будет работать:

 set outfile [open final.sh w]
foreach file [list $dir/1.txt $dir2/ABC1.sh] {
    set sourcefile [open $file r]
    chan copy $sourcefile $outfile
    close $sourcefile
}
close $outfile
 

Комментарии:

1. Да, я вижу только содержимое $dir2/ABC1.sh в final.sh .

2. Версия с chan copy хорошей и правильной.