sqlplusにヒストリ

sqlplusでカーソルキーを入力すると、^[[Aとか出てきて補完してくれない。
HP-UXだとied sqlplusで良いそうだが、Linuxだとどうするのか?

Rubyだとこんな感じらしい。
http://homepage1.nifty.com/~tetsu/ruby/diary/9906.html

RubyがインストールされてないのでPerlでやってみた。

#!/usr/bin/perl

use Term::ReadLine;

my $term = new Term::ReadLine 'my_term';
my $prompt = "SQL> ";
my $OUT = $term->OUT || STDOUT;

my $pid = open(KID_TO_WRITE, "|-");
die "can't fork" unless (defined $pid);

if ($pid) {
    $old = select(KID_TO_WRITE); $| = 1; select($old);
    while ( defined ($_ = $term->readline($prompt)) ) {
        print KID_TO_WRITE "$_\n";
        if ($_ eq 'exit') {
            sleep 1;
            last;
        }
        $term->addhistory($_) if /\S/;
    }
    close(KID_TO_WRITE);
} else {
    my @options;
    my @args = @ARGV;
    my $program = shift @args;
    exec($program, @options, @args);
}

この辺からコピペしています。
http://www.hyuki.com/yukiwiki/wiki.cgi?Term%3A%3AReadLine.pm
http://www.kt.rim.or.jp/~kbk/perl5.005/perlipc.html

まあ、ないよりマシということで。
使い方は ./tmp.pl sqlplus / as sysdba みたいな感じ。

補足:
Term::ReadLineは、Term::ReadLine::Gnuが入っていないとヒストリーが機能しないようだ。Term::ReadLine::Gnuを単独で入れるのは面倒(色々足りないとか怒られる)。

# perl -e shell -MCPAN
cpan> install Bundle::CPAN

で、とりあえずOK。