bash履歴で一連のコマンドを実行するためのショートカットはありますか?


20

私に次の些細な例があると仮定しますhistory

...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...

私は、コマンドを実行したい場合は7778、および791つのコマンドで、このためのショートカットが存在しませんか?私は試してみましたが!77 !78 !79、実行するためにそれらをすべて1行に配置するだけです。


9
!77 ; !78 ; !79大丈夫?
-thrig

1
!77-79
ごと

1
@MrDuk、少年はそれを覚えてしばらく時間がかかりました。非常に簡潔なソリューションについては、更新された回答をご覧ください!:)
ワイルドカード

それは魔法です!:)
MrDuk

回答:


28

編集:修正コマンドツールを使用fcして、POSIX準拠の方法でこれを行うことができます

fc 77 79

これviにより、バッファー内のコマンド77〜79でエディター(おそらく)が開きます。保存して終了すると(:x)、コマンドが実行されます。


それらを編集したくなくて、どのコマンドを呼び出しているかが確実にわかっている場合は、以下を使用できます。

fc -e true 77 79

これはtrue、コマンドを編集するための「エディター」として使用されるため、変更を加えずに終了し、コマンドはそのまま実行されます。


元の回答:

次を使用できます。

history -p \!{77..79} | bash

これは、現在の実行環境にのみ存在するエイリアス、関数、または変数を使用していないことを前提としています。もちろん、これらは、起動中の新しいシェルでは使用できません。


より良い解決策(コメントで思い出させてくれたMichael Hoffmanに感謝):

eval "$(history -p \!{77..79})"

eval実際に適切な非常に少数のケースの1つです!


参照:


2
コマンドのいずれかがあればこれが正常に動作しません変更する変数を変更したり、実行して、例えば、現在の実行環境をcd、それがエッジケースです。
G-Manが「Reinstate Monica」と言う

3
eval "$(history -p \!{77..79})"動作するはずです。
マイケルホフマン

1
@MichaelHoffman、私はそれについて考えていて、それを試してみたと思っていましたが、引用を省いたことに気付きました!ど!それが機能しなかったのも不思議ではありません...今すぐ答えを編集しています。
ワイルドカード

14

簡単な答え:の代わりに!77 !78 !79

  • 入力!77; !78; !79しようとしていると思われることを実行するには、コマンド77、コマンド78、コマンド79を無条件で実行します。
  • 入力!77 && !78 && !79 してコマンド77を実行し、成功したかどうかを確認します。そして、コマンド77が成功した場合、コマンド78を実行します。そして、コマンド78が成功した場合、コマンド79を実行します。

少し賢い答え(端末タイプのウィンドウを使用している場合):

  • 次に入力するコマンドがどのコマンド番号になるかを把握します。
    • これをプロンプトに含めることができます。私は\!あなたのに含めることだと信じていますPS1
    • または、履歴リストを見てください。最後のエントリがの場合、82 history次のコマンドは83です。
  • 83-77 = 6を引きます。
  • を入力し!-6ます。これにより、コマンド77が再実行されます。
  • を選択し!-6、コピーして貼り付けます。コマンド77(./generator.sh)の再実行はコマンド83であったため、コマンド84になり、!-6コマンド78を再実行します。
  • !-6必要に応じて貼り付けを繰り返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.