2時間もハマった。未だ素人の域を越えられない。
まず、シーバング(shebang)行のパスを疑う。shebangをgangbangと覚えていて、Googleで検索したらとんでもないのが出てきて焦った。ちなみにアメフトにおいて複数人でタックルすることをギャングタックルという。うん、関係ない。
#! hogehoge
whichコマンドで該当のものを探す。
% which perl % which ruby % which sh
もし、whichコマンドで見つからなかった場合は、そもそもパスが通っていない。自分のシェルの設定ファイル(.*shrc)でパスのとおり具合をチェックする。
まず、文字コードを疑え。自分のOSで使える文字コードか?自分のOSで使える文字コードがEUC-JPであるとき、iconvで文字コードを変換してみる。自分の環境のiconvではどの文字コードを扱えるのかをしるときは iconv --listとする
% iconv -f UTF-8 -t EUC-JP hogehoge.rb % iconv -f Shift_JIS -t EUC-JP hogehoge.rb % iconv -f ISO-2022-JP -t EUC-JP hogehoge.r
次に、改行コードを疑う。今回はこれにハマった。簡単なのはviで眺めてみること。全部のファイルの改行コードがCRLFだった。これを取り除く。筋が悪くて恐縮だが、あるディレクトリ内の任意の拡張子の改行コードをすべてLFにするスクリプトを作ったので必要な方はどうぞ。多分、途中の文字コードの変換は不要。
# remove_CRLF.rb $KCODE = "UTF8" require "nkf" require "fileutils" if ARGV.length != 2 puts "error: please input like this,\nruby remove_CRLF.rb char_code extention\nex: ruby remove_CRLF.rb euc cgi \n" exit! 0 end fileLists = Dir.glob("*.#{ARGV[1]}") fileLists.each{ |filename| FileUtils.cp("#{filename}","#{filename}.bak") File.open("#{filename}", "w"){ |oFile| puts("replace: #{filename}\n") File.open("#{filename}.bak"){ |iFile| iFile.each{ |line| case ARGV[0].to_s when "jis" then buff = NKF.nkf("-J -w -m0", line) when "euc" then buff = NKF.nkf("-E -w -m0", line) when "sjis" then buff = NKF.nkf("-S -w -m0", line) when "utf8" then buff = NKF.nkf("-W -w -m0", line) else exit! 0 end buff.chomp!("\n") case ARGV[0].to_s when "jis" then line = NKF.nkf("-W -j -m0", buff) when "euc" then line = NKF.nkf("-W -e -m0", buff) when "sjis" then line = NKF.nkf("-W -s -m0", buff) when "utf8" then line = NKF.nkf("-W -w -m0", buff) else return 0 end oFile.puts("#{line}") } } } }
第一引数が文字コード。jis, euc, sjis, utf8のどれかを指定。第二引数は、改行コードを取り除くファイルの拡張子。ファイルの文字コードがutf8で、ファイルの拡張子がcgiならば以下の用に使う
% ruby remove_CRLF.rb utf8 cgi