履歴をbashで検索して結果を実行できますか?
タイプ 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
コマンドを実行します。歴史組み込みコマンド自体に多くの機能があります、あなたはbash
とhistory
のmanページでもっと見ることができます。
!
指定子を使用するときに相対的な負のオフセットを指定することもできます。したがって、上記の履歴リストを使用して、vim
を再度実行する場合は、次のようにします。
$!-2
これは基本的にあなたが "2つのコマンドを実行した"コマンドを実行するようにbashに伝えています。履歴リストの前のコマンドを実行するには、!!
を使用することができます(これは!-1
の単なる省略形です)。
!
指定子は、実行するコマンドを数値で指定することにあなたを制限しません。 hayalci は、bash
に(!
を使用して)先頭のテキストまたは(!?
を使用して)コマンド内のテキストのいずれかに基づいてコマンドを実行するように指示できることを示しています。繰り返しますが、上記の履歴リストの例を使用して、もう一度clear
を実行する場合は、次のように入力するだけです。
$!cl
を押して Enter。そしてvim
はどうでしょうか。それはとても簡単です:
$!?some
hayalci の応答から最も重要な点は、組み込みのshopt
への呼び出しです。
$ shopt -s histverify
!
、!!
、および!?
指定子に一致するコマンドが盲目的に実行されるのではなく、実行前に悪用されないようにコマンドラインで埋められるように、履歴検証を有効にします。 rootユーザーとしてコマンドを実行している場合、これはさらに重要です。このオプションは.bashrc
スタートアップファイルで設定できるので、ログインするたびに設定されます。
すでに指摘したように、この情報はすべて bash
manページ から収集できます。 !、!!、および!?の場合指定子、セクションを見てください 9.3歴史の拡張 。
の代替として crtl+R入力することで履歴を検索できます
!text
これは履歴から最新のコマンドbeginningを 'text'で検索します。
しかし、間違ったコマンドが実行されるのを防ぐために、これを.bashrcに入れることをお勧めします。
shopt -s histverify
これは、any historyアクション(!!:s/prev_text/after_text
のような)の後に、結果の行をコマンドPromptに配置するようにbashに指示します。その後、コマンドを確認または編集して、後でEnterキーを押すことができます。
あなたもすることができます:
history | grep "stuff"
それはのようなものを返すでしょう
num stuff
それからあなたはタイプすることができます
!num
私はreverse-search-historyよりもhistory-search-backwardを使うことを好みます。前者では、最初に検索キーを押してから検索文字列を入力するのではなく、コマンドの数文字を入力してから検索キーを押します。
私のシステムのデフォルトでは、M-pとM-nは似たような関数にバインドしますが、私は矢印キーをバインドすることを好みます:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
私は本当に素晴らしいエイリアスを持っています、h。それは本当に単に "history | grep"ですが、私は以前の "h command"エントリを "grep -E -v"で除外します。
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
のように使われる
h aliases
2003 less .bash_aliases
優れた記事、Sean!私はこれをコメントに入れたいと思いますが、私はいくつかの評判ポイントが恥ずかしがり屋です。 :-)
もう1つの関連した便利なテクニックは、Wordを変更しながら前のコマンドを実行する機能です。ディレクトリ名をタイプミスしたか、ファイル名を変更したいとします。
$ echo私の名前はbob 私の名前はbob $ ^ bob ^ jordan echo私の名前はjordan 私の名前はjordan
コマンドが実行される前にコマンドが展開され、置き換えられ、出力されることに注意してください。したがって、間違ったコマンドが実行されると、bashが実行していたことがわかります。
Ctrl-rを使用して履歴をナビゲートするのはIMOが面倒なので、hhを検討してください。
https://github.com/dvorka/hstr
これにより、ナビゲーションがはるかに簡単になり、簡単になり、効率的になります。
Bashコマンドのプロンプトで、control-Rと入力してから必要なコマンドを数文字入力すると、bashのreadline機能はそのコマンドのコマンド履歴を検索します。
検索を開始した後、もう一度control-Rを押すと、次の一致するコマンドにジャンプできます。
シェルがvi
キーバインディングを使用するように設定されている場合(set -o vi
またはset editing-mode vi
に$HOME/.inputrc
を含む)、<Esc>/some-command<Return>
で検索し、n
(next)またはShift-n
(previous)を押すと、コマンドライン履歴が順に表示されます。
CTRL+R @ John1024が推奨するように、うまく動作しますが、最近のコマンドの多くが似ていて、それらすべてをすばやくスキャンする方法が必要な場合はやや面倒です。代わりに history
を使うこともできます。
$ history | grep keyword
私は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-J
とC-K
で移動してから、Enter
でコマンドを実行することができます。--height
:表示する行数を設定します。--tac
:リストを元に戻す(履歴に対してより論理的)--tiebreak=index
:fzfが結果を更新したときに履歴の順番を維持する