同じ問題に遭遇し、次のコマンド ラインを入力すると、標準の irb でも問題が再現できることがわかりました (このコマンド ラインは、/usr/lib/hbase/bin/hbase を読んで見つけました)。
$ java -cp \
~/.m2/repository/org/jruby/jruby-complete/1.6.5/jruby-complete-1.6.5.jar \
org.jruby.Main /usr/bin/irb
したがって、根本原因は HBase シェルではなく JRuby にあり、さらに調査した結果、JRuby 1.6.5 で使用されている JLine に根本原因があることが判明しました。
まず、 ~/.jlinebindings.properties ファイルを作成し、そこに「Rubout:backward-delete-char」を配置し、バックスペース キーが「カーソルの後ろの 1 文字を削除」することを期待しましたが、機能しませんでした。さらに悪いことに、.jlinebindings.properties ファイルの存在により、他のキー バインド (矢印キーのバインドなど) がクリアされたので、.jlinebindings.properties を削除しました。~/.jline.rc と ~/.inputrc にキーバインディングの設定を追加してみましたが、どちらもうまくいきませんでした。
さらに調査するために JLine2 ソース コードを調べたところ、JLine2 の最新バージョンは .jlinebindings.properties ファイルをサポートしていないことがわかりました。ただし、.jline.rc はサポートされています。ということで、最新のJLIne2ソースコードをコンパイルし、.jline.rcファイルにキーバインディングを入れ、JLine2ライブラリ(target/jline-2.10-SNAPSHOT.jar)をクラスパスの最初の要素に指定したのですが、うまくいきませんでした。新しく構築された JLine2 ライブラリでは、JRuby 1.6.5 が IncompatibleClassChangeError をスローしました。これは、JLine2 がその API を変更し、後方互換性が壊れていることを意味します。
次に、JRuby のソース コードをチェックアウトし、次のようにコンパイルしました。
# JRuby compilation requires ant
$ yum install ant
# Without this, compilation fails.
$ yum install ant-apache-regexp
$ git clone https://github.com/jruby/jruby.git
# Check the latest version
$ git tag
$ git checkout 1.7.1
$ mvn install
新しい JRuby バイナリを使用して、コマンド ラインを再度呼び出しました。
$ java -cp \
~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar \
org.jruby.Main /usr/bin/irb
しかし、SyntaxError が発生しました。
SyntaxError: file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/lc/ja/encoding_aliases.rb:7: syntax error, unexpected kEND
end
^
eval at org/jruby/RubyKernel.java:1066
real_load at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:134
load at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:110
initialize at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:32
init_config at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/init.rb:114
setup at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/init.rb:16
start at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb.rb:53
(root) at /usr/bin/irb:13
encoding_aliases.rb に何か問題があるに違いありません (または、新しい JRuby が後方互換性を損なういくつかの変更を加えた) が、私はそれを調査する気にならなかったので、回避策として LANG=C を追加しました。
$ LANG=C java -cp \
~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar \
org.jruby.Main /usr/bin/irb
これで irb が正常に起動し、バックスペースが期待どおりに動作することを確認できました。maven/jruby-core/pom.xml によると、JRuby 1.7.1 が参照する JLIne のバージョンは 2.7 です。
最後のステップとして、次のようにして、HBase シェルに新しい JRuby を使用させようとしました。
$ cd /usr/lib/hbase/lib
$ mv jruby-complete-1.6.5.jar{,.backup}
$ cp ~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar .
$ hbase shell
しかし、HBase シェルは起動しませんでした。代わりに、以下のエラー メッセージが出力されました。
include_class is deprecated. Use java_import.
include_class is deprecated. Use java_import.
include_class is deprecated. Use java_import.
12/12/28 18:03:12 WARN conf.Configuration: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
NoMethodError: undefined method `getTerminal' for Java::Jline::Terminal:Module
refresh_width at /usr/lib/hbase/bin/../bin/../lib/ruby/shell/formatter.rb:34
initialize at /usr/lib/hbase/bin/../bin/../lib/ruby/shell/formatter.rb:47
(root) at /usr/lib/hbase/bin/../bin/hirb.rb:108
これらのエラー メッセージは、/usr/lib/hbase/lib の下にある jruby-complete-*.jar を置き換えても問題が解決しないことを示しています。
そのため、私はあきらめて、この問題に対する簡単な回避策はないと結論付けました。私の最終的な結論は、HBase の専門家が HBase シェルの実装を新しい JRuby で更新するのを待つ必要があるということです。