web-dev-qa-db-ja.com

前のコマンドまで「スクロール」した後のBASHで、この履歴の次のコマンドに進む方法は?

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

しかし、私は多くの人がこれを不思議に思っていると思います、そして私の質問はだまされているかもしれません...

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

ですから、あなたはコマンドをたぶん30コマンド前に見つけて、それを実行します。そして、その後に最初に来たコマンドを実行したい...これを行う簡単な方法はありますか?または、BASHに堪能な方は、これをどのように行うのですか?

59
mike rodent

でコマンドを実行する Ctrl+o の代わりに Enter 履歴からコマンドを実行し、bash履歴の前に戻るのではなく、次のコマンドをキューに入れます。

97
Jon Reinhold

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

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

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

Jon Reinholdへのコメント:正解ですが、ユーザーがbash変数HISTCONTROLにerasedupsを含めるように設定している場合はC-o履歴に表示される次のコマンドが表示される代わりに、その次のコマンドが表示されるため、ユーザーは混乱します。これは、bashが実行されたコマンドの元のインスタンスを削除したため、その後すべてのコマンドが1行上に移動したためです。履歴リストの1つ低いインデックス番号に。

19
user1404316

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

履歴検索

CTRL-r bashコマンド履歴検索に移動します。検索しているコマンドの入力を開始すると、bashがコマンドをオートコンプリートします。オートコンプリート機能は本当にかなり良いです。実行するコマンドが入力行にある場合、次のことができます。 ENTER コマンドを実行するにはorを押します CTRL-e カーソルをコマンドラインの最後に移動して、履歴検索モードを終了します。

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

履歴検索は非常に強力であり、上矢印を使用して最初にコマンドに戻るのを避けるための優れた方法です。クイック履歴検索により、履歴を手動で検索するlots時間を節約できます。 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での速度と効率を向上させます。

15
111---