unix – bash の履歴を検索してコマンドを再実行するには?

bash unix

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

  321  None  2009-07-17


ベストアンサー

コマンドラインで Ctrl R と入力し、前のコマンドを入力してください。結果が表示されたら、Ctrl Rを押し続けると、他の一致するコマンドが表示されます。目的のコマンドが表示されたら、Enterを押してください

Ctrl Rがデフォルトですが、もしコマンド(reverse-search-history)をCtrl Tにバインドしたい場合は、以下のように設定することができます

bind '"\C-t": reverse-search-history'

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

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

$ history

コマンドのリストを数値のインデックスと一緒に表示します

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

Mitch が指摘しているように、インデックスの前に ! を置くことで、数値インデックスを使ってこれらのコマンドを実行することができます

$ !1

clearコマンドを実行します。履歴ビルトインには多くの機能があり、bashhistoryのマニュアルページを参照してください

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

$ !-2

これは基本的に “2つ前に実行したコマンド “を実行するように bashに指示しているのです。履歴リストの前のコマンドを実行するには、!! (これは !-1 の略語です) を使えばいいのです

!指定子は、どのコマンドを実行するかを数値で指定することを制限するものではありません。hayalci は、bash にコマンドを実行するように指示できることを示しました。繰り返しになりますが、上の例の履歴リストを使って、clearをもう一度実行したい場合、必要なのはタイプすることだけです

$ !cl

と書いて、Enterを押します。で、vimはどうでしょうか?と同じくらい簡単です

$ !?some

hayalciの応答から最も重要なポイントは、shoptのビルトインへの呼び出しです

$ shopt -s histverify

これにより、!, !!, !? で指定されたコマンドがやみくもに実行されるのではなく、コマンドラインに記入され、実行前に悪さをしないことを確認できるように、履歴の検証が可能になります。これは、root ユーザとしてコマンドを実行する場合には、さらに重要です。このオプションは .bashrc スタートアップファイルに設定することができ、ログインしたときにいつでも設定できるようになります

すでに指摘されているように、これらの情報はすべて bash の man ページ から得ることができます。! や ! や !? の指定については、セクション 9.3 歴史の展開 を参照してください

467  None  2009-07-17


もできますよね

history | grep "stuff"

のようなものを返します

num stuff

と入力すると、次のようになります

!num

40  Mitch  2009-07-17


crtl+Rの代わりに、と入力することで履歴を検索することができます

!text

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

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

shopt -s histverify

これは、履歴操作 (!!:s/prev_text/after_text のような) の後に、結果として得られた行をコマンドプロンプトに配置するように bash に指示します。その後、コマンドを確認したり編集したりして、Enter キーを押すことができます

38  hayalci  2009-07-17


私は履歴を逆に検索するよりも、履歴を逆に検索する方が好きです。前者の方が、最初に検索キーを押してから検索文字列を入力するのとは対照的に、コマンドの数文字を入力してから検索キーを押すことができます

私のシステムのデフォルトでは、M-p と M-n は似たような機能にバインドされていますが、私は矢印キーをバインドする方が好きです

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

16  Keith  2011-02-02


私は本当に素晴らしいエイリアスである h を持っています

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

used like

h aliases
2003  less .bash_aliases

13  CurtH  2014-09-25


素晴らしい書き込みですね、ショーンこれをコメントに入れようと思ったのですが、私は数点の評価ポイントを恥ずかしがっています。)

もう一つの関連した便利なテクニックは、単語を変更しながら前のコマンドを実行できることです。ディレクトリ名をタイプミスしてしまった場合や、ファイル名を変更したい場合などに、前のコマンドを実行することができます

$ echo my name is bob
my name is bob
$ ^bob^jordan
echo my name is jordan
my name is jordan

コマンドが実行される前に、コマンドの展開、置換、出力が行われることに注意してください

12  Jordan  2009-09-10


Ctrl-r を使った履歴のナビゲーションは面倒なので、hh を検討してみてはいかがでしょうか

GitHub - dvorka/hstr: bash and zsh shell history suggest box - easily view, navigate, search and manage your command history.
bash and zsh shell history suggest box - easily view, navigate, search and manage your command history. - dvorka/hstr

コマンドの実行も含めて、ナビゲーションをより簡単、簡単、効率的にしてくれます

enter image description here

6  Martin Dvorak  2014-12-18


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

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

4  John1024  2014-09-04


シェルが vi キーバインドを使用するように設定されている場合 (set -o vi または $HOME/.inputrcset editing-mode vi がある場合)、<Esc>/some-command<Return> で検索して n (next) または Shift-n (previous) を押すと、コマンドラインの履歴を循環させることができます

3  Fernando Basso  2015-11-22


CTRL+R は @John1024 が提案したようにうまく動作しますが、最近のコマンドの多くが似たようなもので、それらを素早くスキャンしたい場合には少々面倒です。別の方法としては、historyを使うという方法があります

$ history | grep keyword

2  Mureinik  2014-09-04


HSTRは好きなのですが、たまにインストールできないことがあります。そこで、fzfを使ってエイリアスを書いてみました

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が結果を更新したときの履歴順を保持する

1  Biggybi  2019-05-22


タイトルとURLをコピーしました