Ruby shell 执行中的字符串插值

Ruby String interpolation in a shell execution

我正在尝试制作一个程序的一部分,它将创建一个以当前日期作为文件夹名称的文件夹,最简单的方法似乎是使用字符串插值,但这不起作用,我不确定如何获取要使用的变量

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

最终目标是创建一个包含当前日期的文件夹,但它现在创建一个名为 #{datuh} 的文件夹

谢谢

问题是您对字符串使用了单引号。单引号字符串不使用插值。这是有效的方法:

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

为避免引用问题,您可能需要另一种形式的 spawn:

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

可是,为什么要调用系统呢?

Dir.mkdir datuh.to_s

或者,合并 -p 提供的 "don't throw an error" 功能:

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