이전 명령을 N번 반복합니다.

이전 명령을 N번 반복합니다.

루프를 작성하는 것 외에 마지막 명령을 N번 반복하는 방법이 있습니까?

예를 들어 마지막 명령을 이중성(!!)을 사용하여 한 번 반복할 수 있는데 30번 반복하면 어떨까요?

답변1

zsh마지막 명령줄에 명령이나 파이프 또는 and-or 목록이 하나만 있는 경우(예: echo x, echo x | tr x y또는 심지어 echo x && echo yor/loop와 같은 복합 명령이지만 그렇지 않은 경우), 및를 사용하세요 .{ 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

한 가지 방법은 줄 편집기를 사용하여 !!;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

관련 정보