viモードで「foo.*bar」のbash履歴を取得する方法

viモードで「foo.*bar」のbash履歴を取得する方法

私のbash環境はviモード(set -o vi)です。したがって、単語を入力し<ESC>/てEnterキーを押すと、bashはその単語の履歴を検索できます。/これがviが正規表現を検索する方法でもあるため、bashも正規表現を検索すると仮定しました。

残念ながらbashと入力すると、<ESC>/foo.*bar履歴に正規表現に一致する行が見つかりませんfoo.*bar

私が見落としているものはありますか?それとも正規表現履歴を検索することは不可能ですか?

ベストアンサー1

短い答えはあなたができることですいいえ正規表現を使用してシェル履歴を検索します。 ~によるとPOSIX(Unixファミリーオペレーティングシステムの標準)一般検索が利用可能である必要があります。シェルパターンマッチング(ファイル名のグロービングとcase文用)この機能非増分検索しかし、現在のBashでは正しく実装されていないようです。

POSIX仕様

シェルのPOSIX仕様コマンドライン編集(viモード)これらの検索パターンが通常のシェルパターンマッチングを使用する必要があることを示します。^メタ文字は行の先頭を一致させるために使用されますが、いいえよく使われる表現。

/pattern<newline>

前のコマンドラインから始めて、コマンド履歴を後ろに移動して指定されたパターンを検索します。パターンの使用法で説​​明されているパターン一致記号パターンマッチング表記 ただし、「^」文字は最初の文字として表示されるときに特別な意味を持つ必要があります。模様。この場合、「^」は削除され、「^」以降の文字は行の先頭でのみ一致します。コマンド履歴のコマンドは、ファイル名ではなく文字列として処理する必要があります。

Bash 実装文書化

バッシュを使うGNUリードラインライブラリはインタラクティブなライン編集と履歴検索を提供します。 Readlineライブラリの公式ドキュメントはEmacsモードにもっと焦点を当てていますが、マニュアルには次のような小さなセクションがあります。Readline viモード指摘

Readlineライブラリにはvi編集機能の完全なセットはありませんが、単純な行編集が可能な十分な機能が含まれています。

Readline viモードは、POSIX規格で指定されているとおりに機能します。

実際のBashの実装

2つの異なるシステムで多くの実験を行った後、Bash / Readlineの非増分検索が公式文書に記載されているように機能しないことがわかりました。*アスタリスクは、複数の文字に一致するパターンではなくリテラルとして扱われることがわかりました。同様に?[はリテラル文字として扱われます。

比較のために Vi-mode を使って、tcshPOSIX 標準で指定された履歴検索を正しく実装していることを確認しました。

その後、Readlineライブラリのコードをダウンロードして検索したところ、履歴検索機能は単純な部分文字列検索を使用し、キャレットを除いて検索パターンメタ文字を使用しないことがわかりました^(参照)search.cReadlineライブラリのgitリポジトリ)。

Bash / Readline開発者はまだこの機能を実装していないようです。バグのリストが見つかりませんが、ドキュメントはCHANGESViモードに関連する問題を定期的に修正してきたことを示しています。

修正する:この機能はReadline 8.0(2019年1月のBash 5.0でリリース)で実装されました。記録されたとおり多様性:

Readlineの新機能

ㅏ。非増分viモード検索(N、、n)は、Posixで指定されているようにシェルモードを検索します(fnmatch(3)利用可能な場合は使用されます)。

おすすめ記事