よそから持ってきたスクリプトが動かないとき

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