web-dev-qa-db-ja.com

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

履歴をbashで検索して結果を実行できますか?

292
Richard Hoskins

タイプ CtrlR コマンドラインで、前のコマンドの入力を始めます。結果が表示されたらヒットし続けます CtrlR 他の試合を見る。必要なコマンドが表示されたら、単に押すだけです。 Enter

に注意してください CtrlR コマンド(reverse-search-history)をにバインドしたい場合は、これがデフォルトです。 CtrlT 次のように設定することができます。

 bind '"\ C-t":逆検索履歴' 

あなたにも利用可能な他のreadlineバインド可能コマンドの全体のHostがあります。 bash manページ を見てください。

Bashは対話的なコマンド履歴を検索しアクセスするための多くの機能を持っています。最も基本的なものはhistoryビルトインです。ただタイプする:

 $履歴

次のように、数字のインデックスとともにコマンドのリストを表示します。

 $ history 
 1 clear 
 2 ls -al 
 3 vim〜/ somefile.txt 
 4 history 
 $ 

次に、 Mitch が指摘するように、インデックスの先頭に!を1つ付けることで、これらのコマンドを数値インデックスを使用して実行できます。

 $!1 

clearコマンドを実行します。歴史組み込みコマンド自体に多くの機能があります、あなたはbashhistoryのmanページでもっと見ることができます。

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

 $!-2 

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

!指定子は、実行するコマンドを数値で指定することにあなたを制限しません。 hayalci は、bashに(!を使用して)先頭のテキストまたは(!?を使用して)コマンド内のテキストのいずれかに基づいてコマンドを実行するように指示できることを示しています。繰り返しますが、上記の履歴リストの例を使用して、もう一度clearを実行する場合は、次のように入力するだけです。

 $!cl 

を押して Enter。そしてvimはどうでしょうか。それはとても簡単です:

 $!?some 

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

 $ shopt -s histverify 

!!!、および!?指定子に一致するコマンドが盲目的に実行されるのではなく、実行前に悪用されないようにコマンドラインで埋められるように、履歴検証を有効にします。 rootユーザーとしてコマンドを実行している場合、これはさらに重要です。このオプションは.bashrcスタートアップファイルで設定できるので、ログインするたびに設定されます。

すでに指摘したように、この情報はすべて bash manページ から収集できます。 !、!!、および!?の場合指定子、セクションを見てください 9.3歴史の拡張

421
Sean Bright

の代替として crtl+R入力することで履歴を検索できます

!text

これは履歴から最新のコマンドbeginningを 'text'で検索します。

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

shopt -s histverify

これは、any historyアクション(!!:s/prev_text/after_textのような)の後に、結果の行をコマンドPromptに配置するようにbashに指示します。その後、コマンドを確認または編集して、後でEnterキーを押すことができます。

36
hayalci

あなたもすることができます:

history | grep "stuff"

それはのようなものを返すでしょう

num stuff

それからあなたはタイプすることができます

!num
30
Mitch

私はreverse-search-historyよりもhistory-search-backwardを使うことを好みます。前者では、最初に検索キーを押してから検索文字列を入力するのではなく、コマンドの数文字を入力してから検索キーを押します。

私のシステムのデフォルトでは、M-pとM-nは似たような関数にバインドしますが、私は矢印キーをバインドすることを好みます:

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

私は本当に素晴らしいエイリアスを持っています、h。それは本当に単に "history | grep"ですが、私は以前の "h command"エントリを "grep -E -v"で除外します。

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

のように使われる

h aliases
2003  less .bash_aliases
13
CurtH

優れた記事、Sean!私はこれをコメントに入れたいと思いますが、私はいくつかの評判ポイントが恥ずかしがり屋です。 :-)

もう1つの関連した便利なテクニックは、Wordを変更しながら前のコマンドを実行する機能です。ディレクトリ名をタイプミスしたか、ファイル名を変更したいとします。

$ echo私の名前はbob 
私の名前はbob 
 $ ^ bob ^ jordan 
 echo私の名前はjordan 
私の名前はjordan

コマンドが実行される前にコマンドが展開され、置き換えられ、出力されることに注意してください。したがって、間違ったコマンドが実行されると、bashが実行していたことがわかります。

12
Jordan

Ctrl-rを使用して履歴をナビゲートするのはIMOが面倒なので、hhを検討してください。

https://github.com/dvorka/hstr

これにより、ナビゲーションがはるかに簡単になり、簡単になり、効率的になります。

enter image description here

5
Martin Dvorak

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

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

3
John1024

シェルがviキーバインディングを使用するように設定されている場合(set -o viまたはset editing-mode vi$HOME/.inputrcを含む)、<Esc>/some-command<Return>で検索し、n(next)またはShift-n(previous)を押すと、コマンドライン履歴が順に表示されます。

3
Fernando Basso

CTRL+R @ John1024が推奨するように、うまく動作しますが、最近のコマンドの多くが似ていて、それらすべてをすばやくスキャンする方法が必要な場合はやや面倒です。代わりに history を使うこともできます。

$ history | grep keyword
2
Mureinik

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

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history:ええと、歴史を入手してください
  • sed:リストから数字の列を削除する(POSIX)
  • fzf:これが魔法です。対話的にリストをあいまい検索するか、C-JC-Kで移動してから、Enterでコマンドを実行することができます。
  • --height:表示する行数を設定します。
  • --tac:リストを元に戻す(履歴に対してより論理的)
  • --tiebreak=index:fzfが結果を更新したときに履歴の順番を維持する
0
Biggybi