入力したプレフィックスが付いた前のコマンドを検索します

上下の矢印を使用してコマンド履歴をナビゲートできます。

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

シェル端末で同様の機能を取得する方法はありますか?また、端末の使用効率を向上させるためのその他のヒントはありますか?

コメント

;)

  • @yoann you ' bashが' t 。 readlineを介して、デフォルトではアクセスできません。
  • @muru I ' bashのCTRL + R、およびegmont の回答は、Page Up / PageDownでそれを行うためのきちんとした方法を提供します。ただし、矢印キーを使用してこれを行う方法はありますか?
  • @yoannチェックアウト unix.stackexchange.com/a/76591/70524 \e[5~\e[6~の代わりに、\e[A\e[B
  • 回答

    探しているのは Ctrl です。 R

    Ctrl R と入力し、必要なコマンドの一部を入力します。 Bashは最初に一致するコマンドを表示します。 Ctrl R と入力し続けると、bashは以前の一致するコマンドを循環します。

    履歴を逆方向に検索するには、 Ctrl と入力します。代わりに S 。 ( Ctrl S がそのように機能しない場合は、XON / XOFFフロー制御を無効にする必要がある可能性があります。これを行うには、stty -ixon。)

    これは、man bashの[検索]に記載されています。

    コメント

    • Ctrl-Q を押して、すでに 最初にフロー制御をオフにして端末をフリーズさせずに、

    回答

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

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

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

    コメント

    • これは、現在のすべての回答の中で最も便利な方法です。 uplz少し与える動作メカニズムの説明?
    • ~/.inputrcまたは/etc/inputrc、または環境変数$INPUTRCは、bash(シェル)を含む、readlineを使用するすべてのアプリケーションの行編集構成ファイルです。これには、次の2つを含む特定の組み込みの行編集機能があります。bash'の手動ページで、これらのキーワードの1つを検索して詳細を確認します。 \e[5~ / \e[6~は、ほとんどのターミナルエミュレータでPage Up / Downキーによって生成されるエスケープシーケンスです。これを表示するには、catコマンドを起動し、これらのキーを押します(エスケープバイトは、ターミナルでは^[として表され、inputrcでは次のように表示されます。 \e)。
    • 元の質問の例では、Matlabでは上/下キーがこのように機能することが示されています。 UpとDownのシーケンスをinputrcに配置し、このアクションに割り当てた場合に何が起こったかを確認するのは興味深いことです。正しく動作するのでしょうか、それともデフォルトの動作と競合するため、厄介な副作用が発生するのでしょうか。 'わかりません。'これを試してみたら、調査結果を聞いてうれしいです。
    • echo $INPUTRCを実行すると、空になります。私は' Ubuntu14.04を使用しています
    • これを行うには、個人的に上下の矢印をオーバーライドすることを好みます:"\e[A": history-search-backwardおよび"\e[B": history-search-forward

    回答

    ^ r / ^ sの履歴のほかにi -検索:

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

    これは、mkdir foocd alt-dot。上矢印、^ a、alt-d(前方の単語を削除)、cdよりもさらに高速です。

    最後から2番目の単語を取得するには、次を使用します。 esc - 2 alt+.(つまりalt+.にはemacsスタイルの数値引数を使用します。負の値は最後からカウントインし、正の値は最初から順方向にカウントします。)しかし、これは通常、価値があるよりも厄介です。ある時点で、マウスに手を伸ばしてコピー/貼り付けするか、上矢印を押して^ w / ^ yの一部(以下を参照)。


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


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


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

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

    これらすべてを組み合わせると、

    • コマンドの入力を開始します
    • ctrl-rを使用して古いコマンドに戻り、control-wなどでコマンドの一部を取得します。
    • esc-rまたはalt+rを使用して、一部を削除する前の状態に復元します。
    • alt- >は、履歴の最後に移動し(つまり、ずっと下矢印)、途中のコマンドに戻ります。

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

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

    bashスクリプトを作成する場合は、はインタラクティブシェルでも有効になっています。時々 *.!(c|h)のようなものが終了しないファイルと一致するための用途が見つかるでしょう。 .cまたは.hを使用します。

    ls -llessなどの好きなエイリアスを見つけますたくさん。 (cp -imv -irm -Iは素晴らしいです。習慣を身につけないでください。選択的なrmを実行するためにそれらに依存する 。GNUrm "s-すべての引数を1回要求します。)

    alias m=less(「もっと」を表すm)。 lessで設定しました。を前/次のファイルにバインドしました(lesskey)。デフォルトは、自動リピートでは使用できないマルチキー押下シーケンスです。


    GNU画面内ですべてを行うのが好きです。番号付きの画面ウィンドウを追跡する方がKonsole(または私が試した他のターミナルエミュレーター)のタブのボートロード。 screenをまだ知らない場合は、tmuxを学習してください。これは、新しくて無駄が少ないためです。

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

    コメント

    • 私のものは'正しく構成されていないようです"適切に構成されています"。ここに表示されるショートカットの多くは'機能しません。Ubuntu14.04のストックターミナルを使用しています。構成するにはどうすればよいですか?
    • @JorgeeFG:KDEに切り替える前は、Ubuntu14.04のgnome-terminalで、箱から出してすぐに機能したと思います。関連するオプションは、端末設定、esc-prefix vshigにあります。 hビット、そして多分他のいくつかの設定。それらのいくつかは' sshを介して完全に機能しません。 (たとえば、Ctrlキーを押しながら左/右に矢印キーのエスケープコードを入力すると、5Dが文字通り表示されます)

    回答

    ~/.inputrc

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

    <に次の行を追加しますp>これはegmontの回答に似ていますが、PageUpとPageDownを使用する代わりに、ArrowUpとArrowDownのエスケープシーケンスを使用します。この方法は、Macで使用する方がはるかに便利です。

    回答

    私は常に大きな HISTSIZE 値。これにより、より長い履歴リストが保持され、 HISTTIMEFORMAT とタイムスタンプ値が保持されます。コマンドがいつ実行されたかがわかります。

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

    回答

    私が通常使用する手段は、

    コマンドと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

    コメント

    • CR =はるかに優れている+はるかに安全
    • おそらく、個人的には、grepにパイプされた履歴が、ほとんどのコマンドを見つけるためのより高速な手段であることがわかります。より安全である限り、'意味がわかりません。cRで履歴を検索するのではなく、履歴を使用することに固有のリスクは何ですか?
    • @グレイビーPSkocikは、!履歴の置換の安全性が低いことを意味していると思います。
    • @Gravy固有のリスクは誤って間違った行を取得することです。 Control-Sを使用し、xon / xoffフロー制御を有効にしていない限り(多くの場合、デフォルト)、端末がフリーズした理由はわかりません。もしそうなら、Control-Qはそれを元に戻します。
    • @PSkocikに同意します、crは'なのではるかに優れています同じ方法で再度実行するよりも、履歴行を編集する方が簡単です。まったく同じコマンドを再度実行することは、複雑なワンライナーでバリエーションを再入力したり、長いパスで別のファイルをタブ補完したりする時間を節約するためにできることの簡単なケースです。私の答えを見てください。

    答え

    毎日4つのヒントを使用しました(およびその他) bashターミナルで:

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

    • コマンドを実行 N 履歴から: !N

    • プレフィックス

    履歴から: !prefix:p

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

  • コメント

    答え

    If bashの代わりにzshを使用しても問題ありませんが、 oh-mi-zsh を使用できます。そのために。

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

    edit: Oh-my-zshは、他の多くの機能を含む、開発者向けの大規模なソフトウェアパッケージです。エイリアス、テーマ、プラグイン。これらの追加機能により、配布はキーボードショートカットよりも複雑になります。

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

    コメント

    回答

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

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

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

    これは、一連のコマンドを表示する場合に便利です。同時に。

    ちなみに、"""""は醜いですが、一重引用符で一重引用符を避ける他の方法を見つけることができませんでした。

    コメント

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です