わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

system "cp ..."でトラブル

小ネタです.採点対象ファイルの集計プログラムに,馬鹿馬鹿しいバグを入れてしまっていて,採点作業のやり直しを余儀なくされました.
問題のコードは,こんなの:

command = "cp #{filename_from} #{filename_to}"
puts command
system command

これでは,ファイル名(filename_from,filename_toの値)の中に空白文字があると,おかしな動作になります.例えば,filename_from = "filename from.txt", filename_to = "filename.txt" なんかだったりすると,

cp filename from.txt filename.txt

と出力し,そのまま実行します.filenameというファイル名は実在しないので,エラーとなっていたのでした.
commandの代入のところで,クォートを入れるのは,さらなるバグの温床になりそうだったので,標準添付ライブラリのfileutils*1を使うことにしました.

require "fileutils"
FileUtils.cp(filename_from, filename_to, :verbose => true)

上のように書いて,解決しました.

*1:http://miyamae.github.io/rubydoc-ja/2.2.0/#!/library/fileutils.html.全部小文字がライブラリ名で,FileUtilsはモジュール名とのこと.