마지막 N 명령 반복 [반복]

마지막 N 명령 반복 [반복]

Bash에서 마지막 N 명령을 실행하는 스크립트를 작성하려고 합니다. 예를 들어 N=5입니다.

for i in {1...5}
do
    !-5
done

문제는 !-5가 내 쉘의 마지막 5개 명령(예: time)으로 대체되고 "time" 명령이 5번 실행된다는 것입니다.

쉘에서 마지막 5개 명령을 연속적으로 실행하도록 스크립트를 변경할 수 있습니까?


참고: 다른 유사한 질문을 살펴본 후 이 질문을 게시했지만 해당 질문이 내 요구 사항에 응답하지 않았습니다. 상황은 다음과 유사합니다.
Qn1 - "C++에서 3개의 연속 물결표 '~~'를 어떻게 인쇄합니까?"
답변: cout<<"~~";

Qn2 - "C++에서 N개의 연속 물결표 '~~'를 인쇄하는 방법"
답변: 루프를 실행하고 루프 내에서 cout <<"~"를 실행합니다.

중복으로 표시된 질문은 위의 Qn1과 유사합니다. 위의 Qn2에 대한 답변을 원합니다. 그러므로 나는 이 질문이 이전 질문과 중복된다는 사실을 주장합니다.

답변1

를 사용하면 fc -N -1마지막 N개의 명령이 포함된 편집기가 열립니다.
명령을 편집할 수 있습니다.
저장하면 실행됩니다.

명령을 편집하지 않으려면 옵션을 사용하여 편집기 로 fc지정하십시오 .-ecat

fc -e : -3 -1

별칭은 N 매개변수와 함께 사용하려는 경우 도움이 되지 않습니다. 에 있어야 하기 -N때문에 "fc -1"과 같은 별칭을 갖고 추가할 수도 없습니다 . -1-N

따라서 다음과 같은 함수를 사용해야 합니다.

runlast () {
    fc -e : "-${1:-1}" -1 
}

인수가 지정되지 않으면 명시적 N으로 다음과 같이 설정됩니다. 1이 경우 마지막 명령이 반복됩니다.


마지막 명령으로 echo 1to를 사용하여 작동하는 방법은 다음과 같습니다 .echo 4

$ echo 1
1
$ echo 2
2
$ echo 3
3
$ echo 4
4
$ runlast 2
echo 3
echo 4
3
4
$

(마지막 줄이 $새로운 프롬프트입니다.)

답변2

정확히 무엇을 하고 싶은지 확실하지 않지만 다음을 시도해 볼 수 있습니다.

eval "$(fc -ln -5)"

또는

fc -e : -5 -1

마지막 5개 명령을 다시 실행합니다.

답변3

나는 당신이 이것을 할 수 있다고 생각합니다 :

$ echo yo
yo
$ echo hey there
hey there
$ for i in {2..1}; do eval "$(history -p \!-$i)"; done
yo
hey there

에서 help history:

-p   perform history expansion on each ARG and display the 
     result without storing it in the history list

관련 정보