【问题标题】:Ruby: File.open odd behavior with variable as name of fileRuby:File.open 以变量作为文件名的奇怪行为
【发布时间】:2018-06-21 10:00:52
【问题描述】:

鲁比新手在这里! 我正在尝试使用变量作为要创建的文件的名称来创建和写入 ruby​​ 中的文件。如果我使用文件名的类型,它与另一个变量#{system} 的工作方式相同,但问题似乎出在早期解析的特定变量上。 收到错误 - Errno::ENOENT: 没有这样的文件或目录

array#record contains: 
Sun /log/schedule.log.20180617
Mon /log/schedule.log.20180618  
Tue /log/schedule.log.20180619
Wed /log/schedule.log.20180620
Wed /log/schedule.log

代码部分。

lines = record.split("\n")
lines.each do |line|
    log = /(\/.*schedule.log(?:\.20[0-9]{6})?)/.match(line)
    @cmd = "grep DEBUG #{log} | grep \"start\\|running\""
    rawdata = ssh.exec!(@cmd) 
    logfile = File.new("#{system}_#{log}", 'w+')
       logfile.puts rawdata
    logfile.close
end
ssh.close  

输出 收到错误 - Errno::ENOENT: 没有这样的文件或目录 - server1_schedule.log

所需的输出应创建一些具有命名约定 <persystem_schedule.log<date>> 的日志文件。

【问题讨论】:

  • 这是你得到的字面错误吗? ENOENT 通常表示文件或目录不存在,例如,如果您尝试在foo 不存在时创建foo/bar
  • 我建议您也许可以发布一段人们可以运行的代码,这样更容易获得帮助。即使有人可以通过阅读找到任何错误。
  • iGian - 代码段是实际的代码段。我添加了“记录”数组的值,以便人们更轻松地运行代码,因为这部分代码是 100 多行代码的一部分。它已经缩小了“log”变量的数据类型。不知何故,当我们使用 matchData 时,它不再是一个字符串。我尝试使用 .to_s 将数据类型转换回字符串,但它仍然没有成功。

标签: ruby file


【解决方案1】:

我很确定您没有提供足够的信息来解决问题,但在这些情况下,我发现简化代码通常很有帮助;这样做通常会揭示其他问题。

您使用文件openputsclose 是否有原因?这增加了很多我认为不必要的复杂性,而且这种复杂性可能掩盖了其他一些问题。我建议改变这个:

rawdata = ssh.exec!(@cmd) 
logfile = File.new("#{system}_#{log}", 'w+')
logfile.puts rawdata
logfile.close

到这样的事情:

File.write("#{system}_#{log}", ssh.exec!(@cmd))

并查看结果是否发生变化或是否揭示了不同的问题。

【讨论】:

  • 基思,感谢您的建议。不幸的是,气隙系统不支持 File.write。文件:类的未定义方法“写入”
  • File.write 多年来一直是 Ruby 标准发行版的一部分。您的 Ruby 系统是否修改过,如果修改过,由谁修改过,修改方式是什么?我认为出于安全原因删除File.write 甚至没有意义,因为同样的事情可以通过其他方式完成。您是在自己修改 File 类吗?
  • 好问题。我不确定系统是否被修改,也不确定是谁构建了系统。由于我的 perl 背景,我只是继承了所有 ruby​​ 任务。我可以告诉你,“日志”不是字符串数据类型。 matchdata 正在做某种巫术,我什至无法使用 .to_s 方法将其转换回字符串。
  • 我建议重新安装 Ruby。我喜欢rvm,它让这一切变得非常简单,而且您可以在您的用户空间中进行操作,这样就不需要超级用户访问权限。谷歌install rvm 获取简单说明。
  • 关于logmatchdata的数据类型,我认为你的困惑是由于你可能没有意识到当你在双精度中使用字符串插值(#{})时带引号的字符串,Ruby 在表达式的值上调用to_s。所以 matchdata 从来没有一个字符串; Ruby 打电话给to_s。事实上,在某些情况下匹配不止一个,所以to_s 不适用;取而代之的是[] 运算符(真正的方法)(参见ruby-doc.org/core-2.2.0/MatchData.html#method-i-5B-5D)。
猜你喜欢
  • 2011-12-05
  • 2016-09-28
  • 1970-01-01
  • 2021-10-27
  • 2014-06-05
  • 2017-08-06
相关资源
最近更新 更多