Wiederholen Sie den letzten Befehl N-mal


7

Wenn Sie keine Schleife schreiben, können Sie den letzten Befehl N-mal wiederholen.

Zum Beispiel kann ich den letzten Befehl einmal mit einem Doppelknall (!!) wiederholen, aber wie wiederhole ich ihn 30 Mal?

Antworten:


9

Mit zshund unter der Voraussetzung der letzte Befehlszeile war nur ein Befehl oder eine Pipeline oder und-oder die Liste (das ist zum Beispiel echo x, echo x | tr x y, echo x && echo y, auch Verbindung Befehle wie { x; y; }oder for/ whileSchleifen , aber nicht echo x; echo y):

repeat 30 !!

Verwenden Sie Folgendes, um die vorherige Befehlszeile zu wiederholen, auch wenn sie mehrere Befehle enthielt:

repeat 30 do !!; done

Oder:

repeat 30 {!!}

Mit bashund nur für einfache Befehle (unter den obigen Beispielen nur für den echo xFall) können Sie eine Hilfsfunktion wie folgt definieren:

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

(und repeat 30 !!wie oben verwenden). Ein Nebeneffekt ist, dass der Code, da er in einer Funktion ausgeführt wird, anders "$@"aussieht "$#"und Dinge wie typesetanders funktionieren, sodass Sie Dinge wie:

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

Ein weiterer Ansatz zur emulieren zsh‚s repeat 30 {!!}wäre ein Alias zu erklären , wie:

alias repeat='for i in $(seq'

(unter der Annahme eines unveränderten $IFS)

Und dann benutze:

repeat 30); { !!; }


3

Ein Ansatz könnte darin bestehen, den Zeileneditor !!;30 Mal einzufügen .

Wie bei readline( bash's Zeileneditor) im viModus:

!!; Escdd30p

Das emacsModusäquivalent funktioniert mit dem zshZeileneditor, aber anscheinend nicht mit bash's readline. Sie können jedoch readlinestattdessen kbd-Makros verwenden, die anscheinend wiederholt werden können:

Definieren Sie das kbd-Makro wie folgt !!;:

Ctrl+X(!!; Ctrl+X)

Was Sie später 30 Mal aufrufen können als:

Alt+3Alt+0Ctrl+Xe

1

Das ist ein bisschen hässlich, aber:

 eval "`fc -ln -1`;: "{1..10}\;

Das führende Leerzeichen ist nicht unbedingt erforderlich, aber nützlich, um die Eingabe des evalBefehls in den Verlauf zu unterdrücken, wenn es (oder ) $HISTCONTROLenthält .ignorespaceignoreboth

Alternative:

eval "fc -s $((HISTCMD-2)) "{1..10}\;

Und:

eval 'history -s '{1..10}';fc -s -2;'

0

Der seqBefehl ist Teil von Standard * nix und daher nicht von Ihrer Shell abhängig. Mit ihm und dem Loop-Konstrukt Ihrer Shell können Sie Folgendes tun:

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

oder

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.