履歴から連続コマンドを実行するには?

履歴から連続コマンドを実行するには?

以前に実行された4つのコマンドシーケンスを実行したいとしましょう。コマンド履歴の最初の項目が432の場合は、次のことができます。

$ !432; !433; !434; !435

これを達成するより効率的な方法があるかどうか疑問に思います。

答え1

最近実行されたコマンドを参照する場合、より効率的なアプローチは負の数で参照することです。

!-4; !-3; !-2; !-1

また、これを行うと、最後の履歴エントリに完全なコマンドチェーンが含まれるため、Repeat itを使用できます!!


編集する: この強力な組み込み機能にまだ慣れていない場合fcザイルズが言及。 (を使用しますhelp fc。)負の数も使用できることがわかったので、上記の操作を使用できます。

eval "`fc -ln -4 -1`"

しかし、これには注意があります。その後、そのeval行は最後のコマンドとして履歴に保存されます。したがって、これをやり直すとループに閉じ込められます。

より安全なアプローチは、基本的なfc作業モードを使用することです。つまり、選択したコマンド範囲をエディタに渡し、終了後に実行します。努力する:

 fc -4 -1

コマンド範囲の順序を逆にすることもできます。fc -1 -4

答え2

履歴から一連のコマンドを表示するには、組み込みコマンドを使用します。fc注文する:

fc -ln 432 435

やり直すには:

eval "$(fc -ln 432 435)"

答え3

Bash レコードから複数のコマンドを順次実行するための良い選択肢があります。
履歴の置き換え(または)を使用する代わりに、!432+を使用して履歴を検索して実行する最初のコマンドを見つけた後、+(!-4CtrlrCtrlo対処して次の手順に進みます。)キーの代わりにreturnこれ
コマンドを開始し、次のコマンドを提案します。歴史的に。Ctrl+o好きなだけクリックして、return最後のシーケンスでシーケンスを終了したり、開始せずにCtrl+c停止したりできます。

答え4

fcforループとxsel

これは、複数回接続して最後のnコマンドを再実行したい場合にうまく機能します。

fcn() (
  from="${1:-2}"
  to="${2:-1}"
  if [ "$from" -ne "$to" ]; then
    for i in `seq "$from" -1 "$(($to + 1))"`; do
      printf "$(fc -ln -${i} -${i}) && "
    done
  fi
  printf "$(fc -ln -${to} -${to})"
)

それから:

$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$  echo a &&  echo b &&  echo c
a
b
c
$ # Paste again if you feel like it.
$  echo a &&  echo b &&  echo c
a
b
c

または、いくつかの編集が必要な場合があるより大きなコマンドの場合:

fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh

関連情報