Ruby は環境によってインストールされているパスが異なる場合が少なくないため、
Shebang に直接絶対パスで指定するとポータブルなコードにならない。
これを回避するためには /usr/bin/env を使うと便利なのだが Shebang では引数を2つ以上取れないので以下のような書き方が出来ない。
#!/usr/bin/env ruby -lnaF"[ ]+"
これを解決するには、若干面倒ではあるが /bin/sh から exec を使うことで、オプションを付きで起動させる事が出来る(公式マニュアルだと
magic comment の説明のところに例がある)。
sum.rb
#!/bin/sh
exec ruby -lnaF"[ ]+" -x "$0" "$@"
#!ruby
# encoding: utf-8
BEGIN {sum = 0}
sum += $F[0].to_i
END {puts "合計 = %d" % sum}
-x オプションは #! で始まり ruby を含む行までを読み飛ばしてくれる。
上記の例では入力データが UTF-8 以外の場合、UTF-8 で不正な文字が含まれるため split の際に以下のようなエラーが発生してしまう。
$ ./sum.rb a.txt
./sum.rb:7:in `split': invalid byte sequence in UTF-8 (ArgumentError)
from ./sum.rb:7:in `<main>'
これを回避するには、以下のようにして環境変数 LANG を一時的に変更した状態で起動させると良い。
$ LANG=sjis ./sum.rb a.txt
入力ファイルの文字コードが決め打ち出来る場合には exec 行を以下のように書き換えても良いかもしれない。
exec ruby -Esjis -lnaF"[ ]+" -x "$0" "$@"
文字コードの自動判別をさせたい場合は AWK ライクにせず普通に書いたほうが良いかも???