Системный вызов Ruby, выполняемый до завершения сценария

#ruby #erb #pdflatex

#ruby #erb #pdflatex

Вопрос:

У меня есть скрипт Ruby, который создает документ Latex с использованием шаблона erb. После создания файла .tex я хотел бы выполнить системный вызов для компиляции документа с помощью pdflatex . Вот основные элементы скрипта:

 class Book
  # initialize the class, query a database to get attributes, create the book, etc.
end

my_book = Book.new
tex_file = File.open("/path/to/raw/tex/template")
template = ERB.new(tex_file.read)
f = File.new("/path/to/tex/output.tex")
f.puts template.result
system "pdflatex /path/to/tex/output.tex"
  

system Строка переводит меня в интерактивный режим ввода tex, как если бы документ был пуст. Если я удалю вызов, документ будет сгенерирован как обычно. Как я могу гарантировать, что системный вызов не будет выполнен до тех пор, пока документ не будет сгенерирован? В то же время я просто использую скрипт bash, который вызывает скрипт ruby, а затем pdflatex чтобы обойти проблему.

Ответ №1:

File.new Откроется новый поток, который не будет закрыт (сохранен на диск) до завершения скрипта или пока вы не закроете его вручную.

Это должно сработать:

 ...
f = File.new("/path/to/tex/output.tex")
f.puts template.result
f.close
system "pdflatex /path/to/tex/output.tex"
  

Или более удобный способ:

 ...
File.open("/path/to/tex/output.tex", 'w') do |f|
  f.puts template.result
end

system "pdflatex /path/to/tex/output.tex"
  

File.open С блоком откроет поток, сделает поток доступным через переменную block ( f в этом примере) и автоматически закроет поток после выполнения блока. 'w' Откроется или будет создан файл (если файл уже существует, содержимое будет удалено => Файл будет усечен)

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

1. Для полноты картины другим подходом (менее подходящим) было бы иметь f.flush after f.puts .