Ruby `如果直接在刚刚创建的文件上的“system(';openssl…';)”之后运行,FileUtils.mv`将失败

Ruby `如果直接在刚刚创建的文件上的“system(';openssl…';)”之后运行,FileUtils.mv`将失败,ruby,windows-subsystem-for-linux,Ruby,Windows Subsystem For Linux,我有以下代码: ... system("openssl ... -in #{path.shellescape} -out #{tmpfile.shellescape} ...") FileUtils.mv(tmpfile, path) ... 路径是随机文件.mobileprovision”,tmpfile是临时文件 代码应采用随机文件.mobileprovision,加密到临时文件中,然后将其复制回原始文件。执行FileUtils.mv时,两个文件都应该存在 但我得到一个类似这样的错误: E

我有以下代码:

...
system("openssl ... -in #{path.shellescape} -out #{tmpfile.shellescape} ...")
FileUtils.mv(tmpfile, path)
...
路径
随机文件.mobileprovision”
tmpfile
临时文件

代码应采用
随机文件.mobileprovision
,加密到临时文件中,然后将其复制回原始文件。执行
FileUtils.mv
时,两个文件都应该存在

但我得到一个类似这样的错误:

Errno::ENOENT:
No such file or directory @ rb_file_s_rename - (temporary, randomFile.mobileprovision)
奇怪

在“调试”过程中,我在
FileUtils.mv
前面放了一个“puts`ls`”,它突然工作了
当我将
sleep(0.1)
放在
FileUtils.mv…
前面时也是如此-它不再失败。
发生什么事了


这让我相信,
系统
不是应该的同步(我无法想象……),或者
openssl
在文件真正写入磁盘之前实际返回

为了检查,我将代码改为

system("openssl ...")
puts Time.now.round(10).iso8601(9)
puts `ls -l --time-style=full-iso #{Dir.mktmpdir}`     
FileUtils.mv(tmpfile, path) 
这将输出返回的
系统
后的当前时间,然后获取目录列表以查看文件是否以及何时创建

我的输出:

2017-12-10T05:40:58.309145900+01:00

total 0
-rw-rw-rw- 1 sujan sujan 20 2017-12-10 05:40:58.291071400 +0100 randomFile.mobileprovision
-rw-rw-rw- 1 sujan sujan 65 2017-12-10 05:40:58.320572900 +0100 temporary
因此,
系统
在.30完成。
该列表显示了仅在.32!处创建的
临时
文件

这怎么可能呢?
如何修复或解决此问题



环境:
ruby 2.4.1p111(2017-03-22修订版58053)[x86_64-linux]
在Windows 10上的WSL(Windows linux子系统,Ubuntu的bash)中。

不是一个解决方案,但比
放一个目录列表更好:

因此,看起来您必须循环直到文件存在:

until File.exist?("file1.csv")
  sleep 1
end
资料来源:

我将其与
0.1
一起使用,而不是
1
,上限为2秒,一切取决于不在Mac系统上:

  unless Helper.is_mac?
    count = 0
    # sleep until file exists or 20*0.1s (=2s) passed
    until File.exist?(tmpfile) || count == 20
      sleep(0.1)
      count += 1
    end
  end

如果使用反勾号而不是
system()
,会发生什么情况?e、 g.
output=`openssl…`
另一种尝试:使用opensslgem,而不是向系统抛出。