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

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

私のファイルに次の簡単な例があるとしましょうhistory

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

77、、78コマンドを1つのコマンドで実行したい場合は、ショートカットキーは79ありますか?私はこれを試してみましたが、!77 !78 !79これは単に1行ですべて実行されます。

答え1

編集:POSIX互換方式を使用してこれを行うことができます。修理コマンドツールfc:

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


また見なさい:

答え2

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

  • !77; !78; !79したいことをしようと入力します。無条件に77を命令し、次に78を命令し、次に79を命令するか、
  • 実行命令77を入力して!77 && !78 && !79 成功を確認する。その後、コマンド77が成功すると、コマンド78が実行される。その後、コマンド78が成功すると、コマンド79が実行される。

少しスマートな答え(ターミナルタイプウィンドウにある場合):

  • 入力する次のコマンドのコマンド番号を見つけます。
    • これをプロンプトに含めることができ\!ますPS1
    • または履歴リストを確認してください。最後のエントリがある場合、82 history次のコマンドは83です。
  • 83−77=6を引く。
  • タイプ!-6。これにより、コマンド77が再び実行される。
  • を選択し!-6てコピーして貼り付けます。再実行したコマンド77()は./generator.shコマンド83であったため、コマンド84を実行しているので、!-6コマンド78が再実行されます。
  • !-6必要に応じて繰り返します。

関連情報