
Gemini Embedding 2 または Qwen3-VL を使用した動画のセマンティック検索。
映像フッテージをセマンティック検索。探しているものを入力すると、トリミングされたクリップが返されます。
[!IMPORTANT] 公式ソース: github.com/ssrajadh/sentrysearch は SentrySearch の唯一の公式ホームです。このプロジェクトを転載またはミラーリングする他のサイトはメンテナと提携しておらず、承認もされていません。必ずこのリポジトリからダウンロードしてください。
言語: 英語 · 简体中文
新着: SentrySearch コードベースウォークスルー動画
パイプライン:
SentrySearch は動画を重複するチャンクに分割し、各チャンクを Google の Gemini Embedding API、Alibaba DashScope (qwen-cloud)、またはローカルの Qwen3-VL モデルを使用して動画として埋め込み、ベクトルをローカルの ChromaDB データベースに保存します。検索時には、テキストクエリ (または画像、画像による検索 を参照) が同じベクトル空間に埋め込まれ、保存された動画埋め込みと照合されます。最上位の一致結果が元のファイルから自動的にトリミングされ、クリップとして保存されます。
macOS/Linux:```bash curl -LsSf https://astral.sh/uv/install.sh | sh
**Windows:**```powershell
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
> **Python 3.11 または 3.12 が必要です**(PyTorchのホイールはまだ3.13以上をサポートしていません)。デフォルトのPythonが新しい場合は、管理された3.12をインストールしてツールのインストールを固定してください:
> ```bash
> uv python install 3.12
> uv tool install --python 3.12 .
> ```
3. APIキーを設定します(または[代わりにローカルモデルを使用する](#local-backend-no-api-key-needed))— **デフォルトのGeminiバックエンドにのみ必要です**。`--backend local` または `.env` 内の `DASHSCOPE_API_KEY` を使用する `--backend qwen-cloud` を使用する場合はスキップしてください。```bash
sentrysearch init
これにより、Gemini APIキーの入力を促し、.envに書き込み、テストエンベディングで検証します。
5. 検索:```bash
sentrysearch search "red truck running a stop sign"
ffmpegは動画のチャンク分割とトリミングに必要です。システム全体にインストールされていない場合は、バンドルされているimageio-ffmpegが自動的に使用されます。
手動セットアップ:
sentrysearch initを使用しない場合は、.env.exampleを.envにコピーし、aistudio.google.com/apikeyからキーを手動で追加できます。
$ sentrysearch init
Enter your Gemini API key (get one at https://aistudio.google.com/apikey): ****
Validating API key...
Setup complete. You're ready to go — run sentrysearch index <directory> to get started.
キーがすでに設定されている場合、上書きするかどうかを確認されます。
> **ヒント:** [aistudio.google.com/billing](https://aistudio.google.com/billing) で利用限度額を設定すると、誤った過剰利用を防げます。
### インデックスフッテージ```bash
$ sentrysearch index /path/to/video/footage
Indexing file 1/3: front_2024-01-15_14-30.mp4 [chunk 1/4]
Indexing file 1/3: front_2024-01-15_14-30.mp4 [chunk 2/4]
...
Indexed 12 new chunks from 3 files. Total: 12 chunks from 3 files.
Options:
--chunk-duration 30 — 1チャンクあたりの秒数--overlap 5 — チャンク間のオーバーラップ--no-preprocess — ダウンスケール/フレームレート低減をスキップ(生のチャンクを送信)--target-resolution 480 — 前処理のターゲット高さ(ピクセル)--target-fps 5 — 前処理のターゲットフレームレート--no-skip-still — 視覚的変化がないチャンクもすべて埋め込む--backend local — Geminiの代わりにローカルモデルを使用(詳細は以下)$ sentrysearch search "red truck running a stop sign" #1 [0.87] front_2024-01-15_14-30.mp4 @ 02:15-02:45 #2 [0.74] left_2024-01-15_14-30.mp4 @ 02:10-02:40 #3 [0.61] front_2024-01-20_09-15.mp4 @ 00:30-01:00
Saved clip: ./match_front_2024-01-15_14-30_02m15s-02m45s.mp4
最良の結果の類似度スコアが信頼度しきい値(デフォルト0.41)を下回る場合、トリミングの前にプロンプトが表示されます:```
No confident match found (best score: 0.28). Show results anyway? [y/N]:
--no-trim を使用すると、低信頼度の結果はプロンプトの代わりにメモとして表示されます。
オプション: --results N, --output-dir DIR, --no-trim (自動トリムをスキップ), --threshold 0.5 (信頼度カットオフを調整), --save-top N (最良一致だけでなく上位N個のクリップを保存), --dedupe (より高ランクの選択と類似しすぎる結果を削除; 同じイベントのほぼ重複するチャンクがリストを埋めるのを防止), --rerank (トリム前にVLMに返された候補を再ランク付けさせる)。バックエンドとモデルはインデックスから自動検出されます — 上書きする場合のみ --backend または --model を渡してください。```bash
sentrysearch search "red truck" --save-top 5 --dedupe 0.9
sentrysearch search "pedestrian crossing behind the car" --rerank --results 10
`--dedupe` の値はコサイン類似度の上限(0〜1)です。既に保持されているより上位の結果に対する類似度がこの値を超えた結果は削除されます。値が小さいほど厳しくなります。`0.8` は結果が非常に異なることを要求し、`0.95` はほぼ同一のチャンクのみを削除します。`0.9` が適切なデフォルトです。
`--rerank` は返された各候補クリップを抽出し、それをクエリとともに VLM に送信し、視覚的に一致する可能性の高いものを埋め込みのみの結果よりも前に並べ替えます。Gemini および qwen-cloud 検索では Gemini 2.5 Flash を使用して再ランク付けを行います。ローカル検索ではローカルの Qwen3-VL Instruct リランカーを使用します。再ランク付けが実行できないか、候補のスコア付けができない場合、SentrySearch は検索を失敗させる代わりに、埋め込みランク付けされた結果を保持します。
### 画像による検索
クエリとして参照画像を使用します — 言葉でシーンを説明するのが難しい場合(特定の車のスクリーンショット、別のビデオの参照フレームなど)、"find clips that look like this" のに便利です。```bash
$ sentrysearch img ~/Downloads/image.jpg
#1 [0.72] 2026-03-12_10-44-17-left_repeater.mp4 @ 00:00-00:30
#2 [0.69] 2026-03-12_10-44-17-left_repeater.mp4 @ 00:25-00:55
#3 [0.67] 2026-02-12_20-02-15-front.mp4 @ 00:00-00:18
Saved clip: ./match_2026-03-12_10-44-17-left_repeater_00m00s-00m30s.mp4
画像はインデックスされたビデオチャンクと同じベクトル空間に埋め込まれ、コサイン類似度でランク付けされます。画像検索は --results、--threshold、--save-top、--dedupe、--overlay、--no-trim、--backend、--model をサポートしています。
サポートされている形式: GeminiバックエンドではJPG、PNG、WEBP、GIF、HEIC/HEIF。ローカルバックエンドではさらにPILがデコードできるもの(BMP、TIFFなど)を受け付けます。
注: 画像検索は、必ずしも同じオブジェクトではなく、視覚的に類似した一致を返します。赤いセダンのクエリは、同様の形状の他の赤いセダンを表示する可能性があります — それに応じて期待値を調整してください。
何を検索すればいいかわからない? sentrysearch highlights は、インデックス内で最も異常なクリップ(埋め込みが他のすべてから遠く離れているチャンク)をランク付けし、自動的にトリミングします。新しい映像のダンプをざっと見るのに適しています。```bash
$ sentrysearch highlights -n 3
#1 [0.165] 2026-02-12_20-02-15-back.mp4 @ 00:00-00:18
#2 [0.163] 2026-02-12_20-02-15-right_repeater.mp4 @ 00:00-00:18
#3 [0.149] 2026-02-12_20-02-15-front.mp4 @ 00:00-00:18
...
Scoring methods (`--method`):
- **`knn`** (デフォルト) — チャンクの *k* 最近傍への平均コサイン距離。ロバストで、近い双子のないクリップを表面化します。
- **`centroid`** — インデックス平均からの距離。最も低コストで、過小評価されたものに偏ります。
- **`lof`** — 局所外れ値因子(Local Outlier Factor)。インデックスに複数の異なる「正常」モード(昼 vs 夜 vs ガレージ)がある場合に最適です。
洗練オプション:
- `--against "<query>"` — クエリ *に対する* 異常スコアリング。`--against-mode within`(デフォルト)では、クエリの上位マッチ間での異常をランク付けします(「歩行者クリップ中の奇妙な歩行者」)。`--against-mode global` では、クエリに一致するがインデックスの残りとは異なるクリップを見つけます(「このタイプの稀なイベント」)。
- `--dedupe 0.9` — より上位にランクされた選択肢と類似しすぎる結果を削除します(デフォルト0.9コサイン類似度)。ほぼ重複したフレームがリストを埋めるのを防ぎます。
- `--exclude-baseline` — スコアリングの前に、重心に最も近いインデックスの半分を削除します。インデックスが反復的な「退屈な」映像で占められている場合に便利です。
- `-k, --neighbors 10` — `knn`/`lof` の *k*。
- `--no-trim` — クリップを書き込まずにランキングを表示します。
> **注意:** 統計的に異常であること ≠ 興味深いこと。センサーグリッチ、レンズフレア、ほとんど昼間のインデックス中の夜のフレーム、唯一のガレージクリップなどはすべて高くランクされます。`--exclude-baseline` と `--dedupe` を使用してノイズをフィルタリングするか、`--against` を使用してトピックで制約してください。
### Qwen Cloud(Alibaba DashScope)
オプションの **qwen-cloud** バックエンドを [DashScope](https://www.alibabacloud.com/help/en/model-studio/qwen-api-via-dashscope) / Model Studio のマルチモーダル埋め込みに使用します(デフォルトモデル `qwen3-vl-embedding`、`--dashscope-model` または `DASHSCOPE_EMBEDDING_MODEL` で上書き可能):```bash
uv tool install ".[qwen-cloud]"
export DASHSCOPE_API_KEY=...
sentrysearch index /path/to/footage --backend qwen-cloud
sentrysearch search "your query" --backend qwen-cloud
動画アップロード: ローカルのチャンクファイルは、APIが消費する前に公式Python SDKによって DashScope管理の一時OSS に送信されます(HTTP APIはURLを期待しますが、SDKがアップロードを処理します)。
Gemini APIの代わりにローカルのQwen3-VL-Embeddingモデルを使用してインデックス作成と検索を行います。無料、プライベート、完全に自分のマシン上で動作します。最高の検索品質を得るには、Geminiバックエンドを使用してください。オフライン/プライベート検索が必要な場合、ローカルの8Bモデルは堅実な代替手段であり、2Bモデルはハードウェアが8Bをサポートできない場合のフォールバックです。
モデルはハードウェアから自動検出されます。NVIDIA GPUおよび24GB以上のRAMを搭載したMacではqwen8b、より小さなMacとCPUのみのシステムではqwen2b。--model qwen2bまたは--model qwen8bで上書きできます。ハードウェアに基づいてインストールを選択してください:
うまく動作しないもの: Intel Macおよび専用GPUがないマシン。これらはCPUでfloat32にフォールバックします — 実用的な使用には遅すぎ、メモリを大量に消費します。代わりにGemini APIバックエンド(デフォルト)を使用してください。
わからない場合? Macでは
".[local]"を使用してください。NVIDIAでは".[local-quantized]"を使用してください — 4ビット量子化は、最小限の品質低下で最も幅広いNVIDIAハードウェアで動作します。(bitsandbytesはCUDAが必要で、Mac/MPSでは動作しません。)
Pythonバージョン: PyTorchのwheelは新しいPythonリリースに遅れるため、ローカルバックエンドにはPython 3.11または3.12が必要です。デフォルトのPythonが3.13+の場合は、管理された3.12をインストールし、ツールのインストールをそれに固定してください:```bash uv python install 3.12 uv tool install --python 3.12 ".[local]"
**Mac の前提条件:** システムの FFmpeg をインストールする(ローカルモデルのビデオプロセッサがこれを必要とします — Gemini バックエンドは代わりにバンドルされた ffmpeg を使用します):```bash
brew install ffmpeg
--backend local でインデックスを作成し、検索する — 追加フラグは不要:```bash
sentrysearch index /path/to/footage --backend local
sentrysearch search "car running a red light"
search コマンドは、インデックス作成時に使用したバックエンドとモデルを自動検出します。省略形として `--model` を使用することもできます — これは `--backend local` を意味します:```bash
sentrysearch index /path/to/footage --model qwen2b # same as --backend local --model qwen2b
sentrysearch search "car running a red light" # auto-detects local/qwen2b from index
Options:
--model qwen2b — smaller model, lower quality but only ~6 GB memory (also accepts full HuggingFace IDs)--quantize / --no-quantize — force 4-bit quantization on or off (default: auto-detect based on whether bitsandbytes is installed)Notes:
--rerank downloads a separate Qwen3-VL Instruct model (Qwen/Qwen3-VL-8B-Instruct or Qwen/Qwen3-VL-2B-Instruct) in addition to the embedding model.The local backend stays fast and memory-efficient through a few techniques that compound:
fps=1.0, max_frames=32). A 30-second chunk produces ~30 frames — not hundreds.With all of this, expect ~2-5s per chunk on an A100 and ~3-8s on a T4. On a 4090, the 8B model in bf16 should be in the low single digits per chunk.
Burn speed, location, and time onto trimmed clips:Options:
--model qwen2b — より小さいモデル、品質は低いが約6GBのメモリで動作(フルHuggingFace IDも受け付け)--quantize / --no-quantize — 4ビット量子化を強制的にオン/オフ(デフォルト:bitsandbytesがインストールされているかどうかを自動検出)Notes:
--rerank は、埋め込みモデルに加えて別途Qwen3-VL Instructモデル(Qwen/Qwen3-VL-8B-Instruct または Qwen/Qwen3-VL-2B-Instruct)をダウンロードする。ローカルバックエンドは、複合的に作用するいくつかの手法により、高速かつメモリ効率を維持しています。
fps=1.0、max_frames=32)。30秒のチャンクからは約30フレームが生成され、数百フレームにはなりません。これらすべてにより、A100ではチャンクあたり約2〜5秒、T4では約3〜8秒が期待できます。4090では、bf16の8Bモデルでチャンクあたり低い一桁台になるはずです。
トリミングされたクリップに速度、位置、時間を焼き付けます。```bash sentrysearch search "car cutting me off" --overlay
Teslaのダッシュカムファイルに埋め込まれたテレメトリ(速度、GPS)を抽出し、HUDオーバーレイをレンダリングします。オーバーレイには以下が表示されます:
- **上部中央:** 薄いグレーのカードに速度とMPHラベル
- **カードの下:** 日付と時刻(12時間制、AM/PM)
- **左上:** 市区町村と道路名(逆ジオコーディングによる)

必要条件:
- Teslaファームウェア2025.44.25以降、HW3+
- SEIメタデータは走行映像にのみ存在します(駐車中/セントリーモードでは不可)
- 逆ジオコーディングは、geopyを介した[OpenStreetMapのNominatim API](https://nominatim.openstreetmap.org/)を使用します(オプション)
Teslaオーバーレイサポート付きでインストール:```bash
uv tool install ".[tesla]"
geopyがなくてもオーバーレイは動作しますが、都市名・道路名は省略されます。
ソース: teslamotors/dashcam
SentryMergeは、SentrySearchの結果から1つのイベントに対する全カメラの動画を自動カットする兄弟ツールです。sentrysearch searchが実行されるたびに、結果リストが~/.sentrysearch/last_search.jsonにキャッシュされます。SentryMergeは--last経由でそれを取得し、最適なマルチカメラクリップセットを選択し、VLMにカメラごとのサブ秒単位の可視範囲を問い合わせ、カメラ間で被写体を追跡する1つのフレーム精度の動画にステッチします:```bash
sentrysearch search ""
sentrymerge --last # → merge.mp4
`--last` は検索を再実行せずに動作します。`sentrymerge --query "..."` は内部的に検索を再実行します。インストール手順、VLM バックエンドオプション(Gemini / OpenAI / ローカルの Qwen)、および Tesla 以外のドライブレコーダー向けのモジュラー式 cam-config システムについては、[SentryMerge README](https://github.com/ssrajadh/sentrymerge#readme) を参照してください。
### SentryBlur で編集する
[SentryBlur](https://github.com/ssrajadh/sentryblur) は、ローカルでの顔、ナンバープレート、自然言語による動画の編集を行うための姉妹ツールです。`sentrysearch search` がクリップを保存するたびに、パスを `~/.sentrysearch/last_clip.json` にキャッシュします。SentryBlur は `--last` 経由でそれを取得するため、検索→編集は 2 つのコマンドで完了し、パスを渡す必要はありません。```bash
sentrysearch search "car cuts me off"
sentryblur prompt --last "road signs" # → match_<...>_blurred.mp4
sentryblur faces --lastとsentryblur plates --lastは同様に動作します。高速なCPU検出器にはfacesまたはplatesを選択してください。任意のオブジェクト(スマートフォンの画面、モニター、名札)にはprompt "<text>"を使用します — promptにはNVIDIA GPUまたはApple Siliconが必要です。インストール手順とハードウェアに関する注意事項については、SentryBlur READMEを参照してください。
sentrysearch stats
sentrysearch remove path/to/footage
sentrysearch reset
#### 失敗チャンクとリトライ
リトライ後もチャンクを埋め込めない場合、SentrySearchはそれを`~/.sentrysearch/dlq.json`のデッドレターキュー(DLQ)に記録し、残りの映像のインデックス作成を続行します。チャンクがDLQに送られる原因は、通常、一時的なAPI/バックエンド障害の繰り返し、特定ファイルのデコーダエラー、ファイルの欠落、またはメモリ不足エラーです。ファイル欠落、デコードエラー、OOMなどの恒久的と思われる障害は、同じ設定で同じチャンクを再試行しても効果が期待できないため、即座に記録されます。
失敗したチャンクを確認するには:```bash
sentrysearch dlq list
次のインデックス実行で再試行してください:```bash sentrysearch index /path/to/footage --retry-failed
DLQを再試行せずにクリアする:```bash
sentrysearch dlq clear
デフォルトでは、以降の sentrysearch index の実行は、既にDLQにあるチャンクをスキップするため、失敗に対して繰り返し支払いをしたり待ったりする必要はありません。問題の原因を修正した後、モデル/バックエンド設定を変更した後、またはメモリを解放した後は、--retry-failed を使用してください。
SentrySearchは ~/.sentrysearch/ の下にローカル状態を保持します:
どちらのコマンドにも --verbose を追加すると、デバッグ情報(埋め込み次元、API応答時間、類似度スコア)が表示されます。
Gemini Embedding 2 と Qwen3-VL-Embedding はどちらも動画をネイティブに埋め込むことができます。動画の生のピクセルがテキストクエリと同じベクトル空間に投影されます。文字起こし、フレームのキャプション作成、テキストの中間処理は一切ありません。"赤いトラックが停止標識にいる" のようなテキストクエリは、30秒の動画クリップとベクトルレベルで直接比較できます。これにより、数時間の映像に対するサブ秒の意味検索が実用的になります。
Geminiの埋め込みAPIを使用した1時間の映像のインデックス作成にかかるコストは約$2.84です(デフォルト設定:30秒チャンク、5秒オーバーラップ):
1時間 = 3,600秒の動画 = モデルによって処理される3,600フレーム。 3,600フレーム × $0.00079 = ~$2.84/時間
Gemini APIは、アップロードされた動画からファイルの実際のフレームレートに関係なく、1秒あたり正確に1フレームを抽出しトークン化します。前処理ステップ(ffmpegを介してチャンクを480p、5fpsにダウンスケールする)は、ローカル/帯域幅の最適化です。ペイロードサイズを小さく保つことでAPIリクエストが高速になりタイムアウトしなくなりますが、APIが処理するフレーム数は変わりません。
2つの組み込み最適化が異なる方法でコスト削減に役立ちます:
検索クエリはごくわずかです(テキスト埋め込みのみ)。
DashScopeはマルチモーダル埋め込みを1,000入力トークンあたりの人民元で、モダリティごとに請求します。デフォルトモデル qwen3-vl-embedding の場合、Alibabaの公開レート(お住まいの地域とアップデートについては以下のドキュメントを確認してください)は次のようなものです:
インデックス作成は動画チャンク(動画モダリティ)を送信します。各 search / img クエリは主にテキストまたは画像トークンであり、動画よりもトークン単価が安くなります。実際のコストは、各API呼び出しに対するDashScopeが返すトークン数(解像度、持続時間、DASHSCOPE_VIDEO_FPS などのサンプリング設定に依存)です。Geminiの公開されている1フレームあたりのUSDレートのように、ワークロードを測定せずに「映像1時間あたりの料金」を固定することはできません。
Alibabaは無料トークン枠(例:アクティベーション後の限られた期間内に100万トークン)も文書化しています。DashScopeマルチモーダル埋め込みの計量と課金ページおよびModel Studio / 課金コンソールで確認してください。価格、地域、プロモーションは変更されるためです。
これらのフラグは、Gemini と qwen-cloud の両方のチャンク分割と前処理に影響します:
--chunk-duration / --overlap — 長いチャンクと少ないオーバーラップ = API呼び出しの減少 = 低コスト--no-skip-still — 何も起こっていなくてもすべてのチャンクを埋め込む--target-resolution / --target-fps — 前処理の品質を調整--no-preprocess — 生のチャンクをAPIに送信ローカルバックエンドはインデックス作成および検索中に警告を出力する場合があります。これらは表面的なもので、結果に影響しません:
MPS: nonzero op is not natively supported — Apple Siliconにおける既知のPyTorchの制限。操作は1ステップだけCPUにフォールバックします。それ以外はGPUに残ります。出力品質に影響はありません。video_reader_backend torchcodec error, use torchvision as default — torchcodecがmacOSで互換性のあるFFmpegを見つけられません。ビデオプロセッサは自動的にtorchvisionにフォールバックします。これは予想された動作で、同一の結果を生成します。You are sending unauthenticated requests to the HF Hub — トークンなしでHugging Faceからモデルをダウンロードしています。ダウンロード速度がやや低下する可能性がありますが、モデルは正常に読み込まれます。気になる場合は、HF_TOKEN 環境変数を設定してこの警告を抑制できます。--no-skip-still で無効にします。これはTesla Sentry Modeだけでなく、.mp4 および .mov の映像でも動作します。ディレクトリスキャナーはフォルダ構造に関係なく、両方のファイルタイプを再帰的に検出します。
ffmpeg がPATHに存在するか、imageio-ffmpeg 経由でバンドルされたffmpegを使用(デフォルトでインストール済み)brew install ffmpeg(ビデオデコーダに必要)| ハードウェア | インストールコマンド | 自動検出モデル | 備考 |
|---|
| Apple Silicon, 24GB以上RAM | uv tool install ".[local]" | qwen8b | MPS経由の完全float16 |
| Apple Silicon, 16GB RAM | uv tool install ".[local]" | qwen2b | 8Bは収まらない; 2Bは約6GB使用 |
| Apple Silicon, 8GB RAM | uv tool install ".[local]" | qwen2b | 厳しい — 負荷時にスワップの可能性; 代わりにGemini API推奨 |
| NVIDIA, 18GB以上VRAM | uv tool install ".[local]" | qwen8b | 完全bf16精度(Linux/Windowsで自動的にCUDA wheelが取得されます) |
| NVIDIA, 8–16GB VRAM | uv tool install ".[local-quantized]" | qwen8b | 4ビット量子化(約6~8GB) |
| パス | 書き込み元 | 用途 | 削除しても安全か? |
|---|
db/ | sentrysearch index | 埋め込み映像のChromaDBベクトルインデックス。 | はい。ただしインデックスが削除されます。再度検索する前に sentrysearch index <dir> を再実行してください。 |
.env | sentrysearch init | デフォルトバックエンドのGemini APIキーを保存します。 | はい。ただし、Geminiを使用するコマンドは再度キーの設定を求めるようになります。 |
dlq.json | 失敗した sentrysearch index チャンク | sentrysearch dlq list で確認され、--retry-failed で再試行されるデッドレターキュー。 | はい。削除すると失敗したチャンクを忘れるため、以降のインデックス実行でそれらが新しい作業として再度試行される可能性があります。 |
last_clip.json | クリップを保存するコマンド(search, img, highlights, overlay) | SentryBlurが sentryblur ... --last で最新の保存済みクリップを利用できるようにします。 | はい。--last による受け渡しのみ失われます。保存されたMP4ファイルは削除されません。 |
last_search.json | sentrysearch search, img, highlights | SentryMergeが sentrymerge --last で最新の結果リストを利用できるようにします。 | はい。--last による受け渡しのみ失われます。検索インデックスは変更されません。 |
history | sentrysearch shell | インタラクティブシェルのReadlineコマンド履歴。 | はい。次回シェルは空の履歴で起動します。 |