最後のNコマンドの繰り返し[繰り返し]

最後のNコマンドの繰り返し[繰り返し]

Bashで最後のNコマンドを実行するスクリプトを作成しようとしています。たとえば、N=5 です。

for i in {1...5}
do
    !-5
done

問題は、!-5が私のシェルの最後の5つのコマンド(たとえばtime)に置き換えられ、「time」コマンドが5回実行されることです。

シェルで最後の5つのコマンドを連続して実行するようにスクリプトを変更できますか?


注:他の同様の質問を見た後、この質問を投稿しましたが、その質問は私の要件に答えませんでした。状況は次のようになります。
Qn1 - 「C ++で3つの連続チルダ '~~'をどのように印刷しますか?」
回答: cout<<"~~";

Qn2 - "C++ で N 個の連続チルダ '~~' を印刷する方法"
回答: ループを実行し、ループ内で cout <<"~" を実行します。

重複としてマークされた質問は、上記のQn1に似ています。上記のQn2に答えたいです。したがって、私はこの質問が前の質問と重複していることを主張します。

答え1

を使用すると、fc -N -1最後のN個のコマンドを含むエディタが開きます。
コマンドを編集できます。
保存すると実行されます。

コマンドを編集したくない場合は、オプションを使用してエディタとしてfc指定します。-ecat

fc -e : -3 -1

エイリアスは、Nパラメーターと一緒に使用したい場合は役に立ちません。にする必要がある-Nため、「fc -1」などのエイリアスを持って追加することもできません。 -1-N

したがって、次の関数を使用する必要があります。

runlast () {
    fc -e : "-${1:-1}" -1 
}

引数が指定されていない場合は、明示的Nに次のように設定されます。1この場合、最後のコマンドが繰り返されます。


最後のコマンドとしてecho 1toを使用して機能する方法は次のとおりです。echo 4

$ echo 1
1
$ echo 2
2
$ echo 3
3
$ echo 4
4
$ runlast 2
echo 3
echo 4
3
4
$

(最後の行は$新しいプロンプトです。)

答え2

正確に何をしたいのかわかりませんが、次のことを試すことができます。

eval "$(fc -ln -5)"

または

fc -e : -5 -1

最後の5つのコマンドを再実行してください。

答え3

私はあなたがこれを行うことができると思います:

$ echo yo
yo
$ echo hey there
hey there
$ for i in {2..1}; do eval "$(history -p \!-$i)"; done
yo
hey there

からhelp history

-p   perform history expansion on each ARG and display the 
     result without storing it in the history list

関連情報