前のコマンドまで「スクロール」した後のBASHを使用して、この履歴の次のコマンドに移動する方法を教えてください。


59

申し訳ありませんが、このタイトルは私がこれまでに考案した中で最もエレガントではありません。

しかし、私は多くの人々がこれを疑問に思っていると思います、そして、私の質問はだまされているかもしれません...私が言うことができるすべては私がそれを見つけなかったことです。

「スクロール」と言うときは、キーボードの「上矢印」キーを使用することを意味します。これは明らかに、最新のコマンドから開始して履歴を上にスクロールします。

だから、コマンドが30個ほど戻っているのを見つけて...それを実行します。そして、元々コマンドの後に実行したいコマンドを実行したい...これを行う簡単な方法はありますか?または、BASHに堪能な人はどのようにこれを行いますか?

回答:


96

コマンドをCtrl+ oではなく+ でEnter実行すると、履歴からコマンドが実行され、bash履歴の先頭に戻るのではなく、次のコマンドがキューに入れられます。


2
NetBSDのxtermで実行している自分のbashでこれを試したところ、うまくいきません!これに影響する設定はありますか?.inputrcファイルがありません。Coはreadline(3)のマニュアルページには記載されていません。
リアルト

@Rhialto vi行編集(で有効set -o vi)を使用していemacsますか?Ctrl-O私が知る限り、前者では動作しないからです。
Bレイヤー

:...これはコマンドを使用して改善することができるbind "\C-o":operate-and-get-next(または後にすべてのものを追加bindする~/.inputrc
Bレイヤ

1
私の問題が何であるかがわかりました:^ Oはフラッシュ出力文字(Linuxではサポートされていません)として扱われ、readlineはアクティブな間、これを無効にしません。シンプルなパッチを提供しましたが、bashとreadlineのメンテナーはこれがバグではないと主張しています。同意しません。参照してくださいlists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto

19

Jon Reinholdの答えは素晴らしいですが、私が提案するはるかに強力なソリューションがあります。Jonの答えには落とし穴についてのコメントもありますが、直接コメントできるほどの評判はないので、@ Jon Reinholdがこれを読んだ場合は、以下にコメントを記載してください。

Bashにはfc、bash履歴リストの行番号をパラメーターとして取るコマンドが含まれています。次に、これらの行をテキストとしてデフォルトのエディターを開きます。その時点で、オプションで行を編集できます。その後、エディターを終了すると、bashはこれらの行を実行します!

編集の例として、「; read -p "next ...」のような最後の行を除くすべてに追加します。これにより、bashは各行を実行し、続行する前にプロンプ​​トを表示します。

Jon Reinholdへのコメント:素晴らしい答えですが、ユーザーがbash変数HISTCONTROLをincludeに設定している場合、ユーザーが erasedups実行しC-oた後、表示される履歴の予想される次のコマンドではなく、が表示されます。これは、bashが実行されたコマンドの元のインスタンスを削除したため、その後のすべてのコマンドが1行上にシフトしたためです。履歴リストの1つ下のインデックス番号に。


おかげで、検索して答えを見つけようとして「fc」コマンドに出くわしました。私にとってこれは、BASH新参者が知識に向かって栄光の道に沿ってゆっくりと歩む段階の次の段階を表しています。最初の赤ちゃんのステップが欲しかった。
マイクげっ歯類

3
@mikerodentいいえ。そのため、それ自体とfc両方の前に起こります。(この答えに反して、あまり有用ではありません。)Ctl-obash
kubanczyk

1
の問題erasedupsは明らかにbashのバグです(この状況に備えられている可能性があります)。知っておくと良いが。
アレクシス

2
@kubanczykそれは議論次第です。修正が必要なものに応じて複雑で複雑なコマンドの場合、選択したエディターを使用してコマンドを更新する方がはるかに迅速です。それも簡単です。
プリフタン

14

希望する動作を実現する別の方法は、bash readlineショートカット(そのうちCTRL- o私は信じている)とbash履歴検索に慣れることです。

履歴検索

CTRL- rあなたが探していると、bashはあなたのためのコマンドを自動補完するコマンドの入力を開始することができますbashのコマンド履歴検索、に表示されます。オートコンプリート機能は本当に優れています。ENTER実行するコマンドが入力行にある場合、コマンドを実行するCTRL- eを押してカーソルをコマンド行の最後に移動し、履歴検索モードを終了します。

CTRL- のすばらしいe点は、この時点で、履歴バッファーがこのコマンドにコンテキストに応じて設定されることです。現在、次のコマンドと前のコマンドは、履歴検索で見つけた行の直前と直後に実行されたものです。上矢印または下矢印を押して、次のコマンドを取得できます。

履歴検索は非常に強力であり、最初にコマンドに戻るために上矢印を使用するのを避けるための優れた方法です。迅速な履歴検索を保存することができますたくさんの手で歴史を検索時間のが、その後、あなたが進むことができますCTRL- oジョンは、先に指摘したように。

Readlineのショートカット

全体的なbash-fuを探している場合は、矢印キーのreadlineショートカットを試してみることをお勧めします。それらはより便利で、タイピング速度を上げることができるかもしれませんが、もちろんYMMVです。ここにさらにいくつかあります:

  1. CTRL- n次のコマンド(下矢印に相当)
  2. CTRL- p前のコマンドの場合(上矢印に相当)
  3. CTRL- b文字を戻す(左矢印に相当)
  4. CTRL- f文字を転送します(右矢印に相当)

これらのreadlineショートカット(CTRL- a行頭およびCTRL- e行末)により、コマンドラインimoの速度と効率が向上します。


2
知りません。修飾キーを使用すると、矢印や他のキーを押すよりも遅くなります。EOL / etcについては ホーム/エンドキーを使用する傾向があります(もちろん、かなり便利なものも表示されます)。
プリフタン

@Pryftanまあ、最後の文は意見として提示されます(「imo」を参照)。長距離にわたってキーボードのホーム行にとどまることは、ターミナルやその他のタイピング集中タスクで作業するための良い戦略だと思います。一部の人々は、矢印キーが他の文字に近いキーボードを持っています。その場合、おそらくreadlineのショートカットは魅力的な利便性ではありません。この最後の点をより明確に意見表明にするために、答えを編集します。
111 ---

1
@datUser Tbh「imo」を見逃しました(または、それを考慮しなかった場合、完全に可能です)。本当のことは、逆検索があなたのために働くなら便利です(+1を持っています)。もちろん、fcも(既に述べたように)何かであるため、!(等。)。ユニックスで猫の皮をむく方法はたくさんあります。キーボードに関しても、それは非常に真実です:私はUnicompキーボードを持っています(それを愛し、思い出を持ち帰ります)が、もちろんDvorakを言うまでもなく考慮すべき他のキーボードもあります。結局、より多くのオプションがあればより良いものになり、あなたの仕事(またはプレイ)はより簡単になります:)
Pryftan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.