シェルコマンドを実行する。
成果物
.help shell
sqlite3 :memory: ".help shell" sqlite3 :memory: ".help system"
.shell CMD ARGS... Run CMD ARGS... in a system shell
.system CMD ARGS... Run CMD ARGS... in a system shell
.shell
,.system
どちらも同じ。
.shell
, .system
uname
sqlite3 :memory: ".shell uname -a"
sqlite3 :memory: ".system uname -a"
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
カーネル名の取得。
uname -s
Linux
対話モードでread
.shell { read -p "なんか入力すれば?> " SOME_INPUT; echo "入力結果: ${SOME_INPUT}"; }
なんか入力すれば?>
なんか入力すれば?> aaaaaaaaaaaaaaaaaaaaaaaa
入力結果: aaaaaaaaaaaaaaaaaaaaaaaa
問題は.shell
コマンド1回の実行あたり1プロセスであること。異なるプロセス間ではシェル変数の共有ができない。
.shell read -p "なんか入力すれば?> " SOME_INPUT
なんか入力すれば?>
なんか入力すれば?> bbbbbbbbbbbbb
.shell echo "入力結果: ${SOME_INPUT}"
入力結果:
でない。シェル変数SOME_INPUT
が1回目のコマンド終了時に死んだから。解決するためには同一プロセス内で実行すべき。そのために{ ... }
を使う。
.shell
出力結果は.output
で指定不可
sqlite3 :memory: \ ".output '/tmp/work/tmp.txt'" \ ".shell uname -s" \ ".output stdout" \ "select readfile('/tmp/work/tmp.txt');"
Linux
cat /tmp/work/tmp.txt
.shell
で実行するシェルコマンドの出力先は、シェルコマンド内で指示すること。
sqlite3 :memory: \ ".shell uname -s > /tmp/work/tmp.txt" \ ".output stdout" \ "select readfile('/tmp/work/tmp.txt');"
Linux
cat /tmp/work/tmp.txt
Linux
.shell
出力結果をパラメータにセットできなかった……
- カーネル名
Linux
をuname -s
コマンドから取得する - 1をパラメータ
@kernel_name
にセットする
という予定だった。
失敗ログ
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', (select SUBSTR(cast(readfile('/tmp/work/tmp.txt') as text), 1, length(cast(readfile('/tmp/work/tmp.txt') as text))-1)));" \ ".param list"
kernel_name 'Liux'
なぜn
が消えている? Liux
でなくLinux
が期待値なのだが……。
キャストしないとblob
型になるっぽい。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', readfile('/tmp/work/tmp.txt'));" \ ".param list"
kernel_name X'4C6975780A'
キャストしたらn
が消えて末尾に改行がでた……。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', cast(readfile('/tmp/work/tmp.txt') as text));" \ ".param list"
kernel_name 'Liux '
length
で末尾の1字を消した。だが相変わらずn
が消えたまま。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', (select SUBSTR(cast(readfile('/tmp/work/tmp.txt') as text), 1, length(cast(readfile('/tmp/work/tmp.txt') as text))-1)));" \ ".param list"
kernel_name 'Liux'
ファイル書込前で改行を消そうとしても無駄。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', cast(readfile('/tmp/work/tmp.txt') as text));" \ ".param list"
kernel_name 'Linux '
ファイル読込後に改行を削除しようとREPLACE
関数を試みるもダメ。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', (select REPLACE(cast(readfile('/tmp/work/tmp.txt') as text), '\n', ' ')));" \ ".param list"
kernel_name 'Linux '
SUBSTR
だと長さを指定せねばならない。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', (select SUBSTR(cast(readfile('/tmp/work/tmp.txt') as text), 1, 3)));" \ ".param list"
kernel_name 'Lin '
長さを負数にしたら成功しないか? と期待するもダメ。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', (select SUBSTR(cast(readfile('/tmp/work/tmp.txt') as text), 1, -1)));" \ ".param list"
kernel_name ''
もし負数が使えたなら、-2
とすることで末尾から1文字前までの範囲を指定できることを期待していた。だが使えない。
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', (select SUBSTR(cast(readfile('/tmp/work/tmp.txt') as text), 1, -2)));" \ ".param list"
kernel_name ''
ならTRIM
は? ダメ。つまり空白文字じゃない? 改行ではない? もしやEOF
か?
sqlite3 :memory: \ ".param init" \ ".shell uname -s | tr -d "\n" > /tmp/work/tmp.txt" \ "insert into sqlite_parameters values('@kernel_name', (select TRIM(cast(readfile('/tmp/work/tmp.txt') as text))));" \ ".param list"
kernel_name 'Liux '
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習をはじめよう
- SQLite3学習 SQLiteについて
- SQLite3学習 SQLiteの適切な用途
- SQLite3学習 SQLiteの特徴
- SQLite3学習 SQLiteのクセ
- SQLite3学習 データ型とアフィニティ
- SQLite3学習 演算子の一覧
- SQLite3学習 よくある質問
- SQLite3学習 SQLiteダウンロード&コンパイル
- SQLite3学習 Tclで操作する
- SQLite3学習 ビルドオプション動作確認(SQLITE_ALLOW_URI_AUTHORITY)
- SQLite3学習 面白そうなコンパイルオプション
- SQLite3学習 SQLiteの拡張について
- SQLite3学習 JSON拡張
- SQLite3学習 JSON拡張(json_extract)
- SQLite3学習 JSON拡張(json_each)
- SQLite3学習 JSON拡張(json_tree オブジェクト→行)
- SQLite3学習 JSON拡張(json_tree オブジェクトツリー→行)
- SQLite3学習 JSON拡張(json_tree オブジェクト配列→行)
- SQLite3学習 JSON拡張(json_group_array 行→配列)
- SQLite3学習 JSON拡張(json_group_object 行→オブジェクト)
- SQLite3学習 JSON拡張(json_array_length)
- SQLite3学習 JSON拡張(json_type)
- SQLite3学習 JSON拡張(json_valid)
- SQLite3学習 JSON拡張(json_quote)
- SQLite3学習 JSON拡張(json_array)
- SQLite3学習 JSON拡張(json_object)
- SQLite3学習 JSON拡張(json_patch)
- SQLite3学習 JSON拡張(json_insert)
- SQLite3学習 JSON拡張(json_replace)
- SQLite3学習 JSON拡張(json_set)
- SQLite3学習 JSON拡張(json_remove)
- SQLite3学習 全文検索(FTS5)
- SQLite3学習 全文検索FTSを日本語で使う方法を調べてみた
- 形態素解析MeCabをインストールする
- SQLite3学習 全文検索FTS5のMeCab用トークナイザを実装する
- SQLite3学習 FTS5+MeCabでクエリ構文
- SQLite3学習 FTS5のテーブル作成と初期化
- SQLite3学習 FTS5の補助関数
- SQLite3学習 FTS5のfts5vocab仮想テーブル
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 ファイル入出力(SQL集計)
- SQLite3学習 拡張関数(generate_series)
- SQLite3謎 主キーの型をintにするとinsertで値を省略したらNULLになってしまう
- SQLite3学習 入出力関数(fsdir, readfile, writefile, edit)
- SQLite3ビルド コンパイルオプションを付与する方法(CFLAGS等))
- SQLite3 コンパイルオプション確認方法(pragma compile_options)
- SQLite3ビルド ICUを有効にする(SQLITE_ENABLE_ICU)
- SQLite3拡張 ICUを動的ロードする
- SQLite3拡張 ICUでcollateする
- SQLite3拡張 ICUで全文検索する(FTS4)
- SQLite3拡張 SQL関数一覧(pragma function_list)
- SQLite3拡張 仮想テーブルモジュール一覧(pragma module_list)
- SQLite3拡張 プラグマ一覧(pragma pragma_list)
- SQLite3謎 values()構文
- SQLite3学習 インタフェース概要
- SQLite3学習 CLI起動引数(-A)Archive
- SQLite3ビルド SQLITE_HAVE_ZLIBコンパイルオプション付与するも確認できず
- SQLite3学習 CLI(-readonly)
- MeCabユーザ辞書の作り方(Wikipediaの題名を名詞とした)
- SQLite3学習 CLI(-zip)
- SQLite3ドットコマンド(.archive)
- SQLite3ドットコマンド(.auth)断念
- SQLite3ドットコマンド(.backup .restore)
- SQLite3ドットコマンド(.read)
- SQLite3ドットコマンド(.dump)
- SQLite3ドットコマンド(.bail)謎
- SQLite3ドットコマンド(.binary)
- SQLite3ドットコマンド(.cd)
- SQLite3ドットコマンド(.changes)
- SQLite3ドットコマンド(.testcase .check)
- SQLite3ドットコマンド(.clone)
- SQLite3ドットコマンド(.databases)
- SQLite3ドットコマンド(.dbconfig)
- SQLite3ドットコマンド(.dbinfo)
- SQLite3ドットコマンド(.echo)
- SQLite3ドットコマンド(.eqp)
- SQLite3ドットコマンド(.excel)
- SQLite3ドットコマンド(.exit)
- SQLite3ドットコマンド(.expert)
- SQLite3ドットコマンド(.filectrl)
- SQLite3ドットコマンド(.fullschema)
- SQLite3ドットコマンド(.headers)
- SQLite3ドットコマンド(.help)
- SQLite3ドットコマンド(.import)
- SQLite3ドットコマンド(.imposter)
- SQLite3ドットコマンド(.indexes)
- SQLite3ドットコマンド(.limit)
- SQLite3ドットコマンド(.lint)
- SQLite3ドットコマンド(.load)
- SQLite3ドットコマンド(.log)
- SQLite3ドットコマンド(.mode)
- SQLite3ドットコマンド(.nullvalue)
- SQLite3ドットコマンド(.once)
- SQLite3ドットコマンド(.open)
- SQLite3ドットコマンド(.output)
- SQLite3ドットコマンド(.parameter)
- SQLite3ドットコマンド(.print)
- SQLite3ドットコマンド(.progress)
- SQLite3ドットコマンド(.prompt)
- SQLite3ドットコマンド(.quit)
- SQLite3ドットコマンド(.read)
- SQLite3ドットコマンド(.read)
- SQLite3ドットコマンド(.recover)
- SQLite3ドットコマンド(.save)
- SQLite3ドットコマンド(.scanstats)
- SQLite3ドットコマンド(.schema)
- SQLite3ドットコマンド(.selftest)
- SQLite3ドットコマンド(.separator)
- SQLite3ドットコマンド(.session)
- SQLite3ドットコマンド(.sha3sum)