4

シナリオ:

あなたは毎日の Bash シェルの作業を行っています。前のコマンドを実行したいので、次のように入力します。

history | grep foocommand

foocommand次に、履歴が追跡されている期間に行ったすべてのことのリストを、次のようなリストで取得します。

  585 foocommand --baz --bleet
  750 foocommand | grep quux
  987 history grep | foocommand

コマンド 585 を実行することにしたので、次のように入力します。

  !585

質問:念のために言っておきますが、方程式から最後の一歩を踏み出し、期待される結果を得る方法はありますか? 次のような言い方があればいいのですが。

 "grep through history and automatically run the first item on the list"

また

"grep through history and let me choose which item to run using the arrow keys"
4

5 に答える 5

5

^r(それはCTLR-r) を押して、 foocommandEnter キーを押して入力します ;) これにより、履歴が検索され、一致する最新のエントリが表示されます

于 2009-03-10T16:13:13.857 に答える
4

'!f' を試しましたか? 'f' は foocommand の最初の文字です。

于 2009-03-10T16:09:59.653 に答える
2

個人的には、ksh から派生したエイリアスを使用します。

alias r="fc -e -"

('r' は 'rerun' のことだと思います...)

「foo」で始まる最後のコマンドを再実行できます。

r foo

コマンド 46 から 50 を再実行できます。

r 46 50

コマンド 585 だけを再実行できます。

r 585

唯一の問題は、次のように入力した場合です。

$  cd somewhere

「cd」コマンドの前に余分なスペースがあるため、「r cd」を実行しても機能しません。「fc」コマンドは履歴の根底にあり、次のように入力して、コマンド 46 から 50 を再実行する前に編集できます。

fc 46 50

他のバリアントについても同様です。

(エイリアスの '-e -' は 'null エディターで編集する' を意味します。'fc -e vim' と書いて vim で編集することもできますが、ほとんどの人は VISUAL または EDITOR または FCEDIT または 3 つすべてを設定して不要にしています。 )

残りの部分については、「vim」の人 (狂信者?) として、「set -o vim」と検索機能を使用します: ESC と

/grep\ -e\ 'whatever

「grep -e 'whatever」を含むコマンドの履歴を検索します。検索を繰り返して、履歴をさらにさかのぼったり、行き過ぎた後に逆方向に移動したり、または... emacsモードには同等の検索メカニズムがあると思います。

于 2009-03-11T06:57:36.900 に答える
1

「履歴をgrepして、リストの最初のアイテムを自動的に実行します」

わかった。

`history | grep foocommand | head -1 | tr -s ' ' | cut -d ' ' -f 3-`

それを試してみてください、それはチャンピオンのように機能します!

于 2009-03-10T16:21:12.560 に答える
1

構文

!foo

で始まる最後のコマンドを実行しfooます。

それができない場合、bash は入力に readline ライブラリを使用します。これは、選択したキーにバインドできるhistory-search-forwardおよびコマンドをサポートします。history-search-backwardファイルを編集./inputrcして F8 と Shift-F8 にバインドし、PuTTY に接続したときにコンソールで Windows の同等の機能のように動作するようにしました。

"\e[19~":history-search-backward
"\e[32~":history-search-forward
于 2009-03-10T16:14:07.943 に答える