bashで履歴を検索して結果を実行できますか?
bashで履歴を検索して結果を実行できますか?
回答:
入力し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)。
!指定子は、数値的に実行するコマンドを指定しますを制限するものではありません。hayalciはbash、コマンドで始まるテキスト(を使用!)またはコマンド内のテキスト(を使用)に基づいてコマンドを実行するように指示できることを示しました!?。繰り返しますが、上記のサンプル履歴リストを使用して、clear再度実行する場合は、入力するだけです。
$!cl
を押しEnterます。そして、どうvimですか?それは次のように簡単です:
$!?some
hayalciの応答からの最も重要な点は、shopt組み込み関数の呼び出しです。
$ shopt -s histverify
ように、これが歴史の検証を可能にすることで一致しているコマンド!、!!および!?指定子は盲目的に実行されますが、あなたは彼らがそれらを実行する前に悪を行いません確保することができますので、代わりに、コマンドライン上で充填されていません。rootユーザーとしてコマンドを実行する場合、これはさらに重要です。このオプションは.bashrcスタートアップファイルで設定できるため、ログインするたびに設定されます。
既に指摘したように、この情報はすべてbashmanページから収集できます。!、!!、および!?指定子については、セクション9.3履歴拡張をご覧ください。
shoptbash_profileではなくbashrcに入ります(または、ログインシェルではないシェルでは有効になりません)。
の代わりにcrtl+R、次のように入力して履歴を検索できます
!text
これは、 'text'で始まる最新のコマンドの履歴を検索します。
しかし、これを.bashrcに入れて、間違ったコマンドの実行を防ぐことをお勧めします。
shopt -s histverify
これは、bashに、履歴アクション(など!!:s/prev_text/after_text)の後に、結果の行をコマンドプロンプトに配置するように指示します。その後、コマンドを確認または編集し、その後Enterを押します。
Ctrl-rを使用した履歴のナビゲーションは面倒なので、hhを検討することをお勧めします。
https://github.com/dvorka/hstr
これにより、コマンドの実行を含めて、ナビゲーションがはるかに簡単で簡単かつ効率的になります。

ctrl + rデフォルトでバインドされるようになりました
viキーバインドを使用するようにシェルを構成している場合(set -o viまたはを持っset editing-mode viている場合$HOME/.inputrc)、(次)または(前)を使用して検索し<Esc>/some-command<Return>、ヒットしてコマンドライン履歴を循環します。nShift-n
私は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が結果を更新するときに履歴の順序を保持する