入力したプレフィックスを使用して前のコマンドを検索します


67

上矢印と下矢印を使用して、コマンド履歴内を移動できます。

Matlabなどの一部のIDEでは、何かを入力してから矢印キーを押すと、入力したものから始まる履歴コマンドのみをスクロールします。これは本当に便利ですが、シェル端末ではこれは機能しません。

シェル端末で同様の機能を得る方法はありますか?そして、端末の使用効率を改善するための他のヒントはありますか?


fish;)のような機能を提供するシェルを単に使用できます
-yoann

@yoannは、bashはそうではないと想定しています。readline経由で、デフォルトではアクセスできません。
ムル

@muru私はbashのCTRL + Rを知っています。egmontの答えは、Page Up / Page Downでそれを行うきちんとした方法を提供します。しかし、矢印キーでそうする方法はありますか?
yoann

1
@yoannはunix.stackexchange.com/a/76591/70524をチェックアウトします\e[5~andの代わりに、\e[6~を使用\e[A\e[Bます。
ムル

回答:


95

あなたが探していることですCtrlR

入力してCtrlR、必要なコマンドの一部を入力します。Bashは最初に一致したコマンドを表示します。入力CtrlRを続けると、bashは前の一致するコマンドを繰り返します。

履歴を後方に検索するには、CtrlS代わりに入力します。(それCtrlSがうまくいかない場合は、おそらくXON / XOFFフロー制御を無効にする必要があることを意味しますstty -ixon。それを実行するには、を実行します。)

これはの「検索」に記載されていman bashます。


1
Ctrl-QCtrl-S最初にフロー制御をオフにせずにヒットし、ターミナルをフリーズした場合、フリーズ状態を終了します。
HongboZhu

26

これらを以下に配置します~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

これらはPage UpPage Down希望通りに動作します。(一部のディストリビューションでは、すでに構成されています。)個人的には、これらの方法はCtrl+ Rまたはhistory


これは、現在のすべての答えの中で最も便利な方法です。動作メカニズムについて少し説明していただけますか?
リー

3
~/.inputrcまたは/etc/inputrc、環境変数によって参照されるファイル$INPUTRCは、bash(シェル)を含むreadlineを使用するすべてのアプリケーションの行編集構成ファイルです。この2つを含む、特定の組み込みの行編集機能があります。bashのマニュアルページで、これらのキーワードの1つを検索して詳細を調べます。\e[5~/ \e[6~は、ほとんどのターミナルエミュレータでPage Up / Downキーによって生成されるエスケープシーケンスです。確認するには、catコマンドを起動してからこれらのキーを押します(エスケープバイトは、ターミナル^[ではinputrcでとして表されます\e)。
エグモント

元の質問の例は、MatlabでUp / Downキーがこのように機能することを示しています。inputrcにUpとDownのシーケンスを配置し、このアクションに割り当てた場合に何が起こるかを見るのは興味深いでしょう。正しく動作するか、デフォルトの動作と競合するため厄介な副作用があります。わからない、これを試してみたらあなたの発見を聞いてうれしい。
エグモント

私がecho $INPUTRCするとき、それは空です。Ubuntu 14.04を使用しています
-JorgeeFG

2
:私は個人的にアップオーバーライドし、これを行うには、下矢印を好む"\e[A": history-search-backward"\e[B": history-search-forward
A.Wan

9

^ r / ^ s履歴i-searchに加えて:

alt.前のコマンドの最後の「単語」をカーソルに挿入します。それを繰り返して、古いコマンドから最後の単語を取得します。(ただし、末尾&はバックグラウンドコマンドの最後の単語としてカウントされることに注意してください)。

これはmkdir foocdalt-dotに非常に便利です。、上矢印、^、ALT-D(前方単語を削除)よりもさらに速いですcd

最後から2番目の単語を取得するには、esc - 2 alt+.(つまり、末尾にemacsスタイルの数値引数を使用しalt+.ます。末尾から負のカウント、先頭から正のカウントを使用します)。ある時点で、マウスに手を伸ばしてコピー/貼り付けするか、上向き矢印と^ w / ^ y部分に到達するのが速くなります(以下を参照)。


端末が適切に/適切に設定されている場合、ctrl-leftとctrl-rightは単語単位で前後に移動します。そうでない場合は、少なくともalt-bとalt-fが同じことを行うことを願っています。


ctrl- /は取り消しです。少しオーバーシュートしたときに元に戻すことができれば、自動リピートを使用して単語をより効率的に削除できます。


コマンドのより強力なミキシング/マッチングは、キルリングを使用することによりもたらされます。キルリングは、Emacsと同じように機能します。ctrl-yで最後のctrl-w / ctrl-u / ctrl-backspace / alt-dを貼り付けます。alt-yは、古いキルされたテキストを循環します。

複数のctrl-wまたは連続してキルリングエントリを作成します。2つのものを削除し、後で1つだけを貼り付ける場合は、左右の矢印または何かを使用してエントリを分割します。

これらをすべて組み合わせて、次のことができます。

  • コマンドの入力を開始します
  • ctrl-rで古いコマンドに戻り、control-wまたは同様のコマンドでその一部を取得します。
  • esc-rまたはalt+r一部を削除する前の状態に復元します。
  • 歴史の終わり>(つまり、下向きの矢印)に移動して、途中にいたコマンドに戻ります。

その他のインタラクティブな使用のヒント:

を有効shopt -s globstarにすると、できるようになります**/*.c(現在のディレクトリを含む再帰的)。インタラクティブな使用に便利な場合もありますが、通常find -name '*.c' -exec foo {} +はより優れています。

bashスクリプトを作成する場合shopt -s extglob、インタラクティブシェルでも有効にすると便利です。.cまたは.hで終わらないファイルに一致するようなものを使用する場合あります*.!(c|h)

あなたが好きな別名を検索ls -lless、elseと何もあなたは多くを行います。(cp -imv -i、とrm -Iの習慣に取得しないでください。いいです応じて選択RMを行うには、それらに。GNUのRMの-Iは、すべての引数のために一度要求します。)

私は好きですalias m=less(mは "more")。私がしているlessと設定,し、.次/前のファイルに結合しています(lesskey)。デフォルトは、オートリピートでは使用できない複数キー押下シーケンスです。


私はGNU画面内ですべてをするのが好きです。Konsole(または私が試した他のターミナルエミュレーター)のタブのボートの数よりも、番号の付いたスクリーンウィンドウを追跡する方が簡単だと思います。まだ知らない場合はscreen、tmuxのほうが新しくてあまり手ごわくないので学びましょう。

別のシェルと同じcwdで新しいシェルを開く機能のようなものを取得するには、cd / pushd / popdのカスタムフックcds 8を使用します。これにより、画面ウィンドウ8のシェルが使用しているディレクトリにcd できます これは、スクリーンセッションが1つしかない限り、スクリーンセッション以外のシェルでも機能します。


私のものは「適切に構成」されていないようです。ここに表示されるショートカットの多くは機能しません。Ubuntu14.04のストックターミナルを使用しています。どうすれば設定できますか?
JorgeeFG

@JorgeeFG:gnome-terminalKDEに切り替える前は、Ubuntu 14.04ですぐに使用できたと思います。関連するオプションは、ターミナル設定、esc-prefix vs high-bit、およびその他の設定にあります。そのうちのいくつかは、sshを使用しても完全に機能しません。(たとえば、Ctrlキーを押しながら左/右矢印キーのエスケープコードを変更すると、5D文字通り表示されます)
ピーター

7

次の行を追加します ~/.inputrc

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

これはegmontの答えに似ていますが、Page UpとPage Downを使用する代わりに、Arrow UpとArrow Downのエスケープシーケンスを使用します。この方法は、Macで使用する方がはるかに便利です。


4

私は常に長いHISTSIZE値でマシンを構成し、より長い履歴リストを保持する傾向があります。また、コマンドが実行された時間を確認できるように、タイムスタンプ値でHISTTIMEFORMAT保持します。

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "

3

私が通常使用する手段は、historyコマンドとgrep

IE:

history | grep <command im looking for>

これにより、入力したコマンドの番号付き履歴が表示され、そのコマンドが含まれている場合は、次を使用できます。

!<number listed in history command>

そのコマンドをやり直します。

IE:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

に続く: !571

繰り返します history | grep history


1
CR =はるかに良い+はるかに安全
PSkocik

1
おそらく、個人的には、grepにパイプ処理された履歴が、ほとんどのコマンドを見つけるためのより高速な手段であることがわかります。より安全である限り、cRを使用して履歴を検索することと並んで、履歴を使用する場合の固有のリスクは何ですか?
グレービー

2
@Gravy PSkocikは、!履歴置換の安全性が低いと考えています。
デロバート

3
@Gravy固有のリスクは、誤って間違ったラインを取得することです。Control-Sを使用し、xon / xoffフロー制御を有効にしない限り(多くの場合デフォルト)、端末がフリーズした理由はわかりません。その場合、Control-Qはそれを元に戻します。
デロバート

1
@PSkocikに同意します。crは、同じように再度実行するよりも、履歴行を編集する方が簡単なため、はるかに優れています。完全に同じコマンドを再度実行することは、複雑なワンライナーのバリエーションの再入力や、長いパス内の別のファイルのタブ補完の時間を節約するためにできることの簡単な例です。私の答えをご覧ください。
ピーターコーデス

1

私はbashターミナルで毎日4つのヒント(および他のいくつか)を使用しました。

  • 最後のコマンドを実行: !!

  • 履歴からコマンドN 実行します。 !N

  • 履歴からプレフィックスで 始まる最後のコマンドを出力します !prefix:p

  • 履歴のプレフィックスで 始まる最後のコマンドを実行します !prefix


1

conaのzsh代わりに使用しても問題ない場合は、oh-my-zshを使用します。bash

コマンド履歴内の上下矢印ナビゲーションが含まれています。また、(Mathlabとして)テキストを既に入力している場合も同じナビゲーションが可能です。

編集:エイリアスやテーマなど、開発者向けのその他のものも含まれています。そのため、ディストリビューションはより大きく、より複雑になります。

https://github.com/robbyrussell/oh-my-zsh


1
oh-my-zshたくさんのものが含まれています。特定の設定またはアプリのみが必要な場合、この正確な機能はそのディストリビューションに含まれています。
ムル

投稿を編集しました。シンプルなアプリよりも大きいと警告しました。
user9869932

1

〜/ .bashrcに次のエイリアスを追加します

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

使用法:fireをh fire含むコマンドのリストを取得します。または、fireで始まるコマンドのリストを取得します。h ^fire

これは、一連のコマンドを同時に表示したいときに便利です。

ところで'"'"'、,いですが、一重引用符で一重引用符を避ける他の方法を見つけることができませんでした。


fyi-動作するh="history | awk '{\$1=\"\"; print}'はずです。または、関数を作成して呼び出します。
-DarkHeart

あなたDarkHeartをありがとう、私はあなたのコードを試してみました、私の環境で働いていないことが判明し、多分鉱山で異なるものがある
HOSIゴールデン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.