履歴から連続したコマンドを実行する方法は?


49

以前に実行した4つのコマンドのシーケンスを実行するとします。最初のコマンドがコマンド履歴で432であれば、次のようにできます。

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

私は興味がありますが、これを達成するためのより効率的な方法はありますか?


1
コマンドを実行しないため、これを回答として投稿しません、コマンド432〜435を入力して、history -p \!43{2..5}後続のコピー/貼り付けに適した端末に印刷できます。
ワイルドカード

回答:


48

最近実行されたコマンドを参照している場合、より効率的な方法は負の数でそれらを参照することです:

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

また、一度実行すると、最後の履歴エントリにはコマンドチェーン全体が含まれるため、で繰り返すことができます!!


編集: あなたがまだの場合は、偉大な組み込み機能に慣れfcジルが言及しました。(help fc。を使用します。)負の数も使用できるため、上記と同じことができます。

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

ただし、これには注意点が1つあります。この後、eval行は最後のコマンドとして履歴に保存されます。これを再度実行すると、ループに陥ります!

これを行うより安全な方法は、デフォルトのfc操作モードを使用することです。選択した範囲のコマンドをエディターに転送し、終了後にコマンドを実行します。試してください:

 fc -4 -1

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


私が書いたものを読んだだけです...笑。実際、私は再呼び出しについてはよくわかりません(多分再呼び出しですか?)が、教えてくれてありがとう:)私はいつも修正に感謝しています。
rozcietrzewiacz

Scrabblefinder.comは、reinvokeは有効なScrabble語であると述べています。それ以上決定的なものは得られません。:)
BentFX

1
このような良い回答(+1)があれば、どのようにつづってもかまいません。特に3つのでどちらのスペルフォームショーアップなどの主要なオックスフォード、Camgridge、メリアム・ウェブスター(私はハイフンのために行くだろう):英語辞書
Peter.O

34

履歴内の一連のコマンドを表示するには、組み込みコマンドを使用しますfc

fc -ln 432 435

それらを再度実行するには:

eval "$(fc -ln 432 435)"

4
非常に素晴らしい。私は興味がありますが、なぜman fc私に何も与えてくれません。何のfc略ですか?他にどんなオプションがありますか?
エリックウィルソン

2
@Eric Wilson ...タイプhelp fc...およびhelp help.... help:help [-dms] [pattern ...]組み込みコマンドに関する情報を表示します。
Peter.O

あなたの答えを探してここに戻ってきました。これは本当に素晴らしいビルトインです!特に、デフォルトの機能である場合-エディターを呼び出して、再生するコマンドの範囲を変更します。ありがとう、ジル。
rozcietrzewiacz

1
-lフラグがなければ、悪を必要とせずに実行されevalます。
ベルンハルト

1
@EricWilsonグーグル検索で「Unix in a Nutshell」という本に移動しましfcが、これは「find command」または「fix command」の略です。
ナマケモノ

10

Bash履歴から多数のコマンドを順番に実行するための便利な代替方法があります:
履歴置換(!432または!-4)を使用する代わりに、Ctrl+ rで履歴を検索し、最初のコマンドを見つけたら実行、キーの代わりにCtrl+ ooperate-and-get-next)をreturn押す
これにより、コマンド起動され、履歴から次のコマンドが提案されます。あなたはヒットすることができますCtrl+oあなたが望むように多くの時間と、のいずれかでシーケンスを終了return最後のもののために、またはCtrl+cそれを起動せずに停止します。


うーん、ヒットしCtrl-oたらリテラル^oを出力して、を壊します(reverse-i-search)。他の設定が関係しているのかもしれません。
Ciro Santilli新疆改造中心法轮功六四事件

8

コマンドを編集するのではなくすぐに実行するために、evalを使用したGilesの回答の構文的にスリムなバージョンを次に示します。

fc -e: 432 435

-eのコロン引数はbash noopであり、fcが必要とする「エディターで開く」ステップをスキップする効果があります。また、(最近の)履歴には、evalステートメントではなく、履歴からの実際のコマンドが含まれるようになりました。


0

fc forループと 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.