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
지정하십시오 .-e
cat
fc -e : -3 -1
별칭은 N 매개변수와 함께 사용하려는 경우 도움이 되지 않습니다. 에 있어야 하기 -N
때문에 "fc -1"과 같은 별칭을 갖고 추가할 수도 없습니다 . -1
-N
따라서 다음과 같은 함수를 사용해야 합니다.
runlast () {
fc -e : "-${1:-1}" -1
}
인수가 지정되지 않으면 명시적 N
으로 다음과 같이 설정됩니다. 1
이 경우 마지막 명령이 반복됩니다.
마지막 명령으로 echo 1
to를 사용하여 작동하는 방법은 다음과 같습니다 .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