を失敗した私はこのコードを持っている:``システム( 'opensslの...')の直後に実行する場合FileUtils.mv`は、ファイルに `この作成した
...
system("openssl ... -in #{path.shellescape} -out #{tmpfile.shellescape} ...")
FileUtils.mv(tmpfile, path)
...
path
はtmpfile
が"temporary"
で、"randomFile.mobileprovision"
です。
コードはrandomFile.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...
の前に置くと同じです - それはではなく、はもう失敗します。
何が起こっているのですか?
これは(...私が想像できない)system
のいずれかは、それがあるべきほどの同期ではないことを信じるように私を導いたか、そのopenssl
ファイルが実際にディスクに書き込まれる前に、実際に返されます。
system("openssl ...")
puts Time.now.round(10).iso8601(9)
puts `ls -l --time-style=full-iso #{Dir.mktmpdir}`
FileUtils.mv(tmpfile, path)
system
が返された後、これは現在の時刻を出力するコードを変更し確認するには、それは、ファイルが作成されたときかどうかを確認するためにディレクトリのリストを取得します。
マイ出力:
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
のでsystem
は0.30で行われます。
temporary
ファイルは、.32!で作成されました!
これはどのように可能ですか?
これを修正または回避する方法を教えてください。
環境:ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
WSL内のWindows 10上(Linux用のWindowsサブシステムは、Ubuntuのbashの)。
'system()'の代わりにバックティックを使用するとどうなりますか?例えば'' output = 'openssl ...' '' –
もう一つは試してみてください:システムに砲撃する代わりにOpenSSL gemを使う。 –