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
コマンドを実行します。履歴ビルトインには多くの機能があり、bash
とhistory
のマニュアルページを参照してください
また、!
指定子を使用する際に相対的な負のオフセットを指定することもできますので、上の履歴リストを使用して、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 を検討してみてはいかがでしょうか
コマンドの実行も含めて、ナビゲーションをより簡単、簡単、効率的にしてくれます
6 Martin Dvorak 2014-12-18
bash のコマンドプロンプトで、control-R と入力して、必要なコマンドを数文字入力すると、bash の readline 機能がそのコマンドのコマンド履歴を検索します
検索を開始した後、control-Rを再度入力すると、次の一致するコマンドにジャンプすることができます
4 John1024 2014-09-04
シェルが vi
キーバインドを使用するように設定されている場合 (set -o vi
または $HOME/.inputrc
に set 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-J
とC-K
で移動したり、Enter
でコマンドを実行したりすることができます--height
: 表示する行数を設定します--tac
: リバートリスト (履歴としてはより論理的)--tiebreak=index
: fzfが結果を更新したときの履歴順を保持する
1 Biggybi 2019-05-22