Выполнение системного вызова Ruby до завершения скрипта - PullRequest
0 голосов
/ 08 июня 2011

У меня есть скрипт на Ruby, который создает латексный документ с использованием шаблона 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 переводит меня в режим интерактивного ввода текста, как если бы документ был пустым. Если я удаляю вызов, документ генерируется как обычно. Как я могу гарантировать, что системный вызов не будет выполнен до тех пор, пока документ не будет сгенерирован? Тем временем я просто использую скрипт bash, который вызывает скрипт ruby, а затем pdflatex, чтобы обойти проблему.

1 Ответ

5 голосов
/ 08 июня 2011

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 с блоком откроет поток, сделает поток доступнымчерез блочную переменную (f в этом примере) и автоматически закрыть поток после выполнения блока.'w' откроет или создаст файл (если файл уже существует, содержимое будет удалено => Файл будет усечен)

...