Ruby String интерполяция в исполнении оболочки - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь создать часть программы, которая создаст папку с текущей датой в качестве имени папки. Кажется, самый простой способ - использовать интерполяцию строк, но это не работает, и я не уверен, как получить переменная, которая будет использоваться

require 'date'
puts "Start"
datuh = DateTime.now
puts datuh
pid1 = Kernel.spawn('mkdir -p "#{datuh}"')
Process.wait pid1
puts "Finished"

конечная цель - создать папку с текущей датой, но сейчас она создает папку с именем # {datuh}

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Чтобы избежать проблем с цитированием, вы можете использовать другую форму spawn:

pid = Kernel.spawn 'mkdir', '-p', datuh.to_s

Однако зачем вызывать систему?

Dir.mkdir datuh.to_s

Или для включения функции "не выбрасывайте ошибку", предоставляемой -p:

begin
  Dir.mkdir datuh.to_s
rescue SystemCallError => e
  raise e unless e.errno == Errno::EEXISTS::Errno
end

Или,

require 'fileutils'
FileUtils.mkdir_p datuh.to_s
0 голосов
/ 28 августа 2018

Проблема в том, что вы используете одинарные кавычки для строки. Строки в одинарных кавычках не используют интерполяцию. Вот что работает:

require 'date'
puts "Start"
datuh = DateTime.now
puts datuh
pid1 = Kernel.spawn("mkdir -p \"#{datuh}\"")
Process.wait pid1
puts "Finished"

Подробнее здесь: https://ruby -for-beginners.rubymonstas.org / bonus / string_interpolation.html

...