#!/bin/sh tmpd=`mktemp -d -t resid.XXXXXX` # 一時ディレクトリの作成 # 一時ディレクトリ作成に失敗したらエラーメッセージを出して abort : ${tmpd:?Cannot create temporary directory} ipipe=$tmpd/in # SQL問い合わせ送出用名前つきパイプ名 opipe=$tmpd/out # 結果受け取り用名前つきパイプ名 mkfifo $ipipe $opipe # 2つの名前つきパイプを作成する finalize() { # 終了処理の関数 query2 ".quit" wait # .quit を送ってバックグラウンドプロセス終了を待つ rm -r $tmpd # 一時ディレクトリ抹消 } trap finalize EXIT INT QUIT TERM db=${DB:-resid.sq3} sqlite3 $db < $ipipe & # $ipipe を入力として起動(先にしないと次がブロックする) exec 3> $ipipe # シェルのファイル記述子3で ipipe を open rm $ipipe # オープンしたあとはファイルを消してもアクセスできる query1() { sqlite3 "$db" "$@" # その都度 sqlite3 コマンドを呼ぶ方式 } query2() { # 常駐 sqlite3 と通信する方式 echo ".output $opipe" >&3 # 結果出力用に $opipe を open if [ -z "$1" ]; then # query関数に引数がなければ cat # SQL文を標準入力から読み取り、 else # query関数に引数があれば echo "$@" # 引数自体をSQL文として fi >&3 # ファイル記述子3に送り込む echo ".output stdout" >&3 # これで $opipe が閉じられる cat $opipe # $opipe は close されたので cat してもブロックしない } query1 "CREATE TABLE IF NOT EXISTS re(a,b);" query1< " >&2 read x || break # C-d ならループを抜けて終了 query1 "$x" # query1 関数に問い合わせ文を送る lir=`query1 "SELECT last_insert_rowid();"` echo "last_insert_rowid() = $lir" done echo "常駐 sqlite3 に切り替えます。" while true; do echo -n "問い合わせ文を入れてください(2)> " >&2 read x || break # C-d ならループを抜けて終了 query2 "$x" # query2 関数に問い合わせ文を送る lir=`query2 "SELECT last_insert_rowid();"` echo "last_insert_rowid() = $lir" done