Bash 기록에서 일련의 명령을 실행하는 바로가기가 있습니까?

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이것은 단순히 한 줄에서 모두 실행될 것입니다.

답변1

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

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!


또한보십시오:

답변2

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

  • !77; !78; !79하고 싶은 일을 하려고 입력합니다 . 무조건 77을 명령하고, 그 다음 78을 명령하고, 그 다음 79를 명령하거나
  • 실행 명령어 77을 입력하여 !77 && !78 && !79 성공 여부를 확인합니다. 그런 다음 명령 77이 성공하면 명령 78이 실행됩니다. 그런 다음 명령 78이 성공하면 명령 79가 실행됩니다.

약간 더 스마트한 답변(터미널 유형 창에 있는 경우):

  • 입력하는 다음 명령의 명령 번호를 찾으십시오.
    • 이를 프롬프트에 포함시키는 것이 가능 \!합니다 PS1.
    • 또는 기록 목록을 확인하세요. 마지막 항목이 이면 82 history다음 명령은 83입니다.
  • 83−77=6을 뺍니다.
  • 유형 !-6. 그러면 명령 77이 다시 실행됩니다.
  • 을 선택 !-6하고 복사하여 붙여넣으세요. 다시 실행한 명령 77( )은 ./generator.sh명령 83이었으므로 이제 명령 84를 실행하고 있으므로 !-6명령 78이 다시 실행됩니다.
  • !-6필요에 따라 반복합니다.

관련 정보