以下のRubyコードの意図された操作は次のとおりです。
- コマンドラインで指定されたファイルであるARGV[0]を古いものに書き込みます
- そのファイルの新しい一時的なコピーを作成します
- ユーザーが入力するまでループする
- 一時ファイルを削除します
hello.cに等しい古いコードをハードコーディングすると、doループ内のタイムアウトは期待どおりに機能します。キーボードからの入力を3秒間待機します。何も指定されていない場合は、レスキューブロックに入り、繰り返します。
oldをARGV[0](これもhello.c)に設定すると、fpにhello.cの最初の行が割り当てられ、コードがループから抜け出します。
実行方法:
user@cpu live$ ruby test.rb hello.c
hello.c
#include <stdio.h>
user@cpu live$
コード:
#!/usr/bin/env ruby
require 'timeout'
old = ARGV[0].chomp
puts old # sanity check
# old = 'hello.c'
new = 'tmp_' + old
`cp #{old} #{new}`
fp = nil
loop do
begin
Timeout::timeout(3) { fp = gets }
puts fp # sanity check
break if (fp)
rescue Timeout::Error
# ...
end
end
`rm #{new}`
コマンドラインからの読み取りがファイル名のハードコーディングと異なる理由がわかりません。
私はあなたが与えることができるどんな助けにも感謝します。ありがとう。