역사에서 연속 명령을 실행하는 방법?


49

이전에 실행 한 4 개의 명령 시퀀스를 실행하려고한다고 가정합니다. 명령 기록에서 첫 번째 항목이 432이면 다음과 같이 할 수 있습니다.

$ !432; !433; !434; !435

궁금합니다. 더 효율적인 방법이 있습니까?


1
명령을 실행 하지 않기 때문에 이것을 답변으로 게시하지는 않지만 history -p \!43{2..5}후속 복사 / 붙여 넣기에 적합한 명령 432-435를 터미널에 인쇄하도록 입력 할 수 있습니다.
와일드 카드

답변:


48

최근에 실행 된 명령을 나타내는 경우보다 효율적인 방법은 음수로 명령을 참조하는 것입니다.

!-4; !-3; !-2; !-1

또한 일단 실행하면 마지막 기록 항목에 전체 명령 체인이 포함되므로를 사용하여 반복 할 수 있습니다 !!.


편집 : 당신이하지 않았다면, 위대한 내장 기능에 익숙해 질 fc, 질 언급 . (을 사용하십시오 help fc.) 음수를 사용할 수도 있으므로 위와 동일하게 사용할 수 있습니다.

eval "`fc -ln -4 -1`"

그러나 여기에는 한 가지주의 사항이 있습니다.이 후에 eval행은 마지막 명령으로 내역에 저장됩니다. 다시 실행하면 루프에 빠지게됩니다!

이 작업을 수행하는보다 안전한 방법은 기본 fc작업 모드 를 사용하는 것입니다 . 선택한 명령 범위를 편집기로 전달하고 종료 한 후에 실행합니다. 시험:

 fc -4 -1

명령 범위의 순서를 반대로 바꿀 수도 있습니다. fc -1 -4


방금 내가 쓴 것을 읽었습니다. LOL. 실제로, 나는 reinvoke ( re-invoke 아마도?) 에 대해 확신하지 못하지만, 알려 주셔서 감사합니다 :) 나는 항상 수정에 감사드립니다.
rozcietrzewiacz

Scrabblefinder.com은 reinvoke가 유효한 글자 맞추기 단어라고 말합니다. 그보다 더 확실한 것은 없습니다. :)
BentFX

1
이와 같은 좋은 대답 (+1)은 어떻게 철자를 쓰든 상관 없습니다. 특히 3 가지 주요 영어 사전 에 철자 형태가 나타나지 않는 경우 : Oxford, Camgridge, Merriam-Webster (하이픈으로 갈
것임

34

히스토리에서 다양한 명령을 보려면 내장 fc명령을 사용하십시오 .

fc -ln 432 435

다시 실행하려면 다음을 수행하십시오.

eval "$(fc -ln 432 435)"

4
아주 좋아요 그래도 궁금하지만 왜 man fc나에게 아무것도주지 않습니다. 무엇 fc을 의미합니까? 다른 옵션이 있습니까?
Eric Wilson

2
@Eric Wilson ... type help fc... 및 help help.... help : help [-dms] [pattern ...] 내장 명령에 대한 정보를 표시합니다.
Peter.O

방금 돌아와서 답을 찾으십시오. 이것은 정말 위대한 내장입니다! 특히 기본 기능인 경우 재생할 명령 범위를 수정하기 위해 편집기를 호출합니다. 고마워, 질
rozcietrzewiacz

1
-l플래그가 없으면 악이 필요없이 실행됩니다 eval.
Bernhard

1
@EricWilson Google 검색으로 "find command"또는 "fix command" 를 나타내는 "Unix in a Nutshell" 이 나옵니다 fc.
Slothworks 5

10

Bash 히스토리에서 여러 명령을 순차적으로 실행하는 훌륭하고 대체적인 방법이 있습니다.
히스토리 대체 ( !432또는 !-4) 를 사용하는 대신 Ctrl+로 히스토리를 검색 할 수 있으며 r원하는 첫 번째 명령을 찾은 후 키 대신에 run, hit Ctrl+ o( opera-and-get-next ) 명령실행 하고 기록에서 다음 명령을 제안합니다 . 당신 이 원하는만큼 많은 시간을 가할 수 있고 마지막을 위해 시퀀스를 끝내 거나 시작하지 않고 멈출 수 있습니다.return
Ctrl+oreturnCtrl+c


흠, 내가 그것을 친 후에 Ctrl-o는 리터럴을 출력하고 ^o내를 깨뜨 립니다 (reverse-i-search). 다른 설정이있을 수 있습니다.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

8

명령을 편집하지 않고 즉시 명령을 실행하려면 eval을 사용하여 구문 적으로 더 얇은 Giles 응답 버전이 있습니다 .

fc -e: 432 435

-e에 대한 콜론 인수는 bash noop이며, fc가 원하는 "편집기에서 열기"단계를 건너 뛰는 효과가 있습니다. 또한 (최근) 히스토리에는 eval 문이 아니라 히스토리의 실제 명령이 포함됩니다.


0

fc for 루프와 xsel

마지막 n 명령을 여러 번 연결하고 다시 실행하려는 경우 잘 작동합니다.

fcn() (
  from="${1:-2}"
  to="${2:-1}"
  if [ "$from" -ne "$to" ]; then
    for i in `seq "$from" -1 "$(($to + 1))"`; do
      printf "$(fc -ln -${i} -${i}) && "
    done
  fi
  printf "$(fc -ln -${to} -${to})"
)

그때:

$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$  echo a &&  echo b &&  echo c
a
b
c
$ # Paste again if you feel like it.
$  echo a &&  echo b &&  echo c
a
b
c

또는 약간의 편집이 필요한 큰 명령의 경우 :

fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.