前のコマンドをN回繰り返します。

前のコマンドをN回繰り返します。

ループを書く以外に、最後のコマンドをN回繰り返す方法はありますか?

たとえば、最後のコマンドを二重性(!!)を使用して1回繰り返すことができますが、30回繰り返すとどうなりますか?

答え1

zsh最後のコマンドラインにコマンド、パイプ、 and-or のリストが 1 つしかない場合 (たとえば、 or またはecho xループecho x | tr x yなどecho x && echo yの複合コマンドですが、そうでない場合) と を使用します。{ x; y; }forwhileecho x; echo y

repeat 30 !!

前のコマンドラインを繰り返すには(複数のコマンドが含まれている場合でも)、次を使用します。

repeat 30 do !!; done

または:

repeat 30 {!!}

bash単純なコマンド(上記の例では場合のみ)に対してのみ、echo x次のヘルパー関数を定義できます。

repeat() {
  local n="$1"
  shift
  while ((n-- > 0)); do
    "$@"
  done
}

(そしてrepeat 30 !!上記のように使用します)。副作用は、コードが関数内で実行されるために異なるように表示され、"$@"その"$#"ような操作がtypeset異なる動作をするため、次のことができないことです。

eval 'echo "$1"'
repeat 30 !!

シミュレートする別の方法は、エイリアスを宣言することzshです。たとえば、次のようになります。repeat 30 {!!}

alias repeat='for i in $(seq'

(修正がないと仮定$IFS

次に、次を使用します。

repeat 30); { !!; }

答え2

私が思いつくことができる最も短いものは次のとおりです。

date # or whatever command
for i in {1..30}; do !!; done

答え3

1つの方法は、行エディタを使用して!!;30回挿入することです。

readlineモードのbash(ラインエディタ)と同じですvi

!! Escdd30p

そのモードはラインエディタemacsでは機能しますzshが、明らかにbashsでは機能しませんreadline。しかし、readline代わりにkbdマクロを使用することができ、これは明らかに反復可能です。

kbdマクロを次のように定義します!!;

Ctrl+X(!!; Ctrl+X)

後で次のように30回呼び出すことができます。

Alt+3Alt+0Ctrl+X金利

答え4

このseqコマンドは標準 *nix の一部なので、シェルに依存しません。これとシェルのループ構成を使用して、次のことができます。

for i in $(seq 30); do !!; done

または

for i in `seq 30`; do !!; done

関連情報