bash 기록에서 일련의 명령을 실행하는 바로 가기가 있습니까? 예를 가지고 있다고 가정 해보십시오

내가 다음과 같은 간단한 예를 가지고 있다고 가정 해보십시오 history.

...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...

내가 명령을 실행하고 싶다면 77, 78그리고 79하나 개의 명령이 바로 가기가 존재 하는가? 나는 !77 !78 !79그것을 모두 한 줄에 배치하여 실행할 것입니다.



답변

편집 : 수정 명령 도구를fc 사용하여 POSIX 호환 방식 으로이 작업을 수행 할 수 있습니다 .

fc 77 79

vi버퍼에 명령 77에서 79까지 편집기가 열립니다 (아마도 ). ( :x) 를 저장하고 종료 하면 명령이 실행됩니다.


당신이 그것들을 편집하고 싶지 않고 당신이 호출하는 명령을 아는 것이 확실하다면, 다음을 사용할 수 있습니다 :

fc -e true 77 79

true명령은 “편집기”로 사용하여 명령을 편집하므로 변경하지 않고 종료되며 명령은 그대로 실행됩니다.


원래 답변 :

당신이 사용할 수있는:

history -p \!{77..79} | bash

이것은 현재 실행 환경에만 존재하는 별칭이나 함수 또는 변수를 사용하지 않는다고 가정합니다. 물론 시작되는 새 쉘에서는 사용할 수 없습니다.


더 나은 해결책 (Michael Hoffman에게 의견을 상기시켜 주셔서 감사합니다)은 다음과 같습니다.

eval "$(history -p \!{77..79})"

eval실제로 적절한 매우 적은 경우 중 하나입니다 !


참조 :


답변

간단한 답 : 대신에 !77 !78 !79,

  • !77; !78; !79명령 77을 실행 한 다음 명령 78을 실행 한 다음 무조건 또는 명령 79를 수행하려고 시도하는 것처럼 보이는 작업을 입력하십시오.
  • 입력 !77 && !78 && !79
    명령 77을 실행하고 성공 여부를 확인 할 수 있습니다. 그리고 명령 77이 성공하면 명령 78을 실행하고 명령 78이 성공하면 명령 79를 실행하십시오.

약간 똑똑한 답변 (터미널 유형 창에있는 경우) :

  • 다음에 입력 할 명령 번호를 확인하십시오.
    • 프롬프트에이를 포함시킬 수 있습니다. \!귀하 의에 포함 되어 있다고 생각 합니다 PS1.
    • 또는 당신의 역사 목록을보십시오. 마지막 항목이 82 history인 경우 다음 명령은 83입니다.
  • 83-77 = 6을 뺍니다.
  • 을 입력하십시오 !-6. 명령 77이 다시 실행됩니다.
  • 를 선택하고 !-6복사하여 붙여 넣습니다. 명령 77 ( ./generator.sh)을 다시 실행 하면 명령 83이되었으므로 이제 명령 84에 있으므로 !-6명령 78을 다시 실행합니다.
  • !-6원하는대로 붙여 넣기 를 반복하십시오 .