Shell执行中的Ruby字符串插值

时间:2018-08-28 19:08:25

标签: ruby shell string-interpolation

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

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

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

谢谢

2 个答案:

答案 0 :(得分:2)

为避免引用问题,您可能希望使用另一种形式的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

答案 1 :(得分:0)

问题是您在字符串中使用单引号。单引号字符串不使用插值。这是可行的:

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