ループを書く以外に、最後のコマンドをN回繰り返す方法はありますか?
たとえば、最後のコマンドを二重性(!!)を使用して1回繰り返すことができますが、30回繰り返すとどうなりますか?
答え1
zsh
最後のコマンドラインにコマンド、パイプ、 and-or のリストが 1 つしかない場合 (たとえば、 or またはecho x
ループecho x | tr x y
などecho x && echo y
の複合コマンドですが、そうでない場合) と を使用します。{ x; y; }
for
while
echo 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
が、明らかにbash
sでは機能しません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