루프를 작성하는 것 외에 마지막 명령을 N번 반복하는 방법이 있습니까?
예를 들어 마지막 명령을 이중성(!!)을 사용하여 한 번 반복할 수 있는데 30번 반복하면 어떨까요?
답변1
zsh
마지막 명령줄에 명령이나 파이프 또는 and-or 목록이 하나만 있는 경우(예: echo x
, echo x | tr x y
또는 심지어 echo x && echo y
or/loop와 같은 복합 명령이지만 그렇지 않은 경우), 및를 사용하세요 .{ 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
한 가지 방법은 줄 편집기를 사용하여 !!;
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