bash履歴を検索してコマンドを再実行するにはどうすればよいですか?


回答:


428

入力しCtrl R、コマンドラインで、前のコマンドの入力を開始します。結果が表示されたら、Ctrl R他の一致を見るためにヒットを続けます。目的のコマンドが表示されたら、単にEnter

while Ctrl Rがデフォルトですが、コマンド(reverse-search-history)をバインドするCtrl T場合は、次のように構成できます。

バインド '"\ Ct":reverse-search-history'

同様に利用可能な他のreadlineバインド可能コマンドのホストが多数あります。見てくださいbashmanページを

Bashには、インタラクティブなコマンド履歴を検索してアクセスするための多くの機能があります。最も基本的なものはhistory組み込みです。入力するだけ:

$履歴

次のような数値インデックスとともにコマンドのリストを出力します。

$履歴
1クリア
2 ls -al
3 vim〜/ somefile.txt
4歴史
$

その後!Mitchが指摘したように、インデックスの前に単一のインデックスを付けることにより、数値インデックスを使用してこれらのコマンドを実行できます。

$!1

clearコマンドを実行します。組み込みの履歴には多くの機能がbashありhistoryます。詳細については、manページを参照してください。

!指定子を使用するときに相対的な負のオフセットを指定することもできます。そのため、上記の履歴リストを使用して、vim再度実行したい場合は次のようにします。

$!-2

これは、基本的に「2つのコマンド前に」実行したコマンドを実行するようにbashに指示しています。履歴リスト内の前のコマンドを実行するには、単に使用できます!!(これはの省略形です!-1)。

!指定子は、数値的に実行するコマンドを指定しますを制限するものではありません。hayalcibash、コマンドで始まるテキスト(を使用!)またはコマンド内のテキスト(を使用)に基づいてコマンドを実行するように指示できることを示しました!?。繰り返しますが、上記のサンプル履歴リストを使用して、clear再度実行する場合は、入力するだけです。

$!cl

を押しEnterます。そして、どうvimですか?それは次のように簡単です:

$!?some

hayalciの応答からの最も重要な点は、shopt組み込み関数の呼び出しです。

$ shopt -s histverify

ように、これが歴史の検証を可能にすることで一致しているコマンド!!!および!?指定子は盲目的に実行されますが、あなたは彼らがそれらを実行する前に悪を行いません確保することができますので、代わりに、コマンドライン上で充填されていません。rootユーザーとしてコマンドを実行する場合、これはさらに重要です。このオプションは.bashrcスタートアップファイルで設定できるため、ログインするたびに設定されます。

既に指摘したように、この情報はすべてbashmanページから収集できます。!、!!、および!?指定子については、セクション9.3履歴拡張をご覧ください


39
+1すべてのシステムで12年以上Linuxを使用しています。私はそれが存在することを知りませんでした。どうすれば見逃しましたか?
アイデンベル

1
多くのシステムでは、上矢印を押すと同じことが行われます。
mas

誰かが '!'、 '!!'、 '!?'、 'historyを統合する場合 grep」と「ctrl-r」を総合的な答えにすると、私はそれを選択します
リチャード・ホスキンズ

shoptbash_profileではなくbashrcに入ります(または、ログインシェルではないシェルでは有効になりません)。
東武

2
また、CTRL + Rを押した後、CTRL + SHIFT + Rを複数回使用して、前のコマンドに戻ることができます。
Gal Bracha

37

の代わりにcrtl+R、次のように入力して履歴を検索できます

!text

これは、 'text'で始まる最新のコマンドの履歴を検索します。

しかし、これを.bashrcに入れて、間違ったコマンドの実行を防ぐことをお勧めします。

shopt -s histverify

これは、bashに履歴アクション(など!!:s/prev_text/after_text)の後に、結果の行をコマンドプロンプトに配置するように指示します。その後、コマンドを確認または編集し、その後Enterを押します。


5
!?textを使用して、「text」を含む(先頭ではなく)最新のコマンドを再実行します。
mark4o 09

3
誰かが '!'、 '!!'、 '!?'、 'historyを統合する場合 grep '、および' ctrl-r 'を包括的に答えて、それを選択します。
リチャード

32

次のこともできます。

history | grep "stuff"

それは次のようなものを返します

num stuff

その後、入力することができます

!num

15

reverse-search-historyよりhistory-search-backwardを使用することを好みます。前者は、コマンドの数文字を入力することができます後、検索文字列を入力して、最初の検索キーを押すと対照的に、検索キーを押してください。

私のシステムのデフォルトでは、MpとMnは同様の機能にバインドしますが、矢印キーをバインドすることを好みます。

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'

13

私には本当に素晴らしい別名があります、h。実際には「history | grep」ですが、「grep -E -v」で以前の「h command」エントリを除外します

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

のように使用

h aliases
2003  less .bash_aliases

1
これは、コマンドをに追加することでも実現できHISTIGNOREます。
タンネンブリング

12

素晴らしい記事、ショーン!これをコメントに入れましたが、恥ずかしがり屋の評判ポイントがいくつかあります。:-)

別の関連する便利なテクニックは、単語を変更しながら前のコマンドを実行する機能です。ディレクトリ名をタイプミスした、またはファイル名を変更したい場合:

$ echo私の名前はボブ
私の名前はボブです
$ ^ bob ^ jordan
エコー私の名前はジョーダンです
私の名前はヨルダンです

コマンドが実行される前に、コマンドが展開、置換、および出力されるため、間違ったコマンドが実行された場合、bashが実行していたと思われるものを確認できます。


6

Ctrl-rを使用した履歴のナビゲーションは面倒なので、hhを検討することをお勧めします。

https://github.com/dvorka/hstr

これにより、コマンドの実行を含めて、ナビゲーションがはるかに簡単で簡単かつ効率的になります。

ここに画像の説明を入力してください


それを使用する方法?この写真を見るにはどのキーを押すべきですか?
ナキロン

2
hhをインストールしたら、ドキュメントの説明に従って、hhコ​​マンドを使用するか、キーボードショートカット(通常はCtrl-r)にバインドできます。
マーティンド

ctrl + rデフォルトでバインドされるようになりました
Alleo

4

bashコマンドプロンプトでcontrol-Rと入力し、必要なコマンドの数文字を入力すると、bashのreadline機能はそのコマンドのコマンド履歴を検索します。

検索を開始した後、もう一度control-Rを入力して、次の一致するコマンドにジャンプできます。


3

viキーバインドを使用するようにシェルを構成している場合(set -o viまたはを持っset editing-mode viている場合$HOME/.inputrc)、(次)または(前)を使用して検索し<Esc>/some-command<Return>、ヒットしてコマンドライン履歴を循環します。nShift-n


これはvimユーザーに最も近いものです。
ガボールマートン

2

CTRL+ Rは、@ John1024が提案したように正常に機能しますが、最近のコマンドの多くが類似しており、それらすべてをすばやくスキャンする方法が必要な場合は、多少面倒です。代わりに使用することhistoryです:

$ history | grep keyword

0

私はHSTRが好きですが、時々それをインストールすることができないようです。そこで、fzfを使用してその動作を模倣するエイリアスを作成しました(hx「履歴実行」の場合)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history :さて、履歴を取得する
  • sed :リストから数値列を削除します(POSIX)
  • fzf:ここに魔法があり、リストを対話式にファジー検索したり、C-Jand C-Kで移動したり、でコマンドを実行したりできますEnter
  • --height :表示される行数を設定します。
  • --tac :リストを元に戻す(履歴に対してより論理的)
  • --tiebreak=index :fzfが結果を更新するときに履歴の順序を保持する
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.