기록에서 연속 명령을 실행하는 방법은 무엇입니까?

기록에서 연속 명령을 실행하는 방법은 무엇입니까?

이전에 실행된 4개의 명령 시퀀스를 실행하고 싶다고 가정해 보겠습니다. 명령 기록의 첫 번째 항목이 432인 경우 다음을 수행할 수 있습니다.

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

이것을 달성하는 더 효율적인 방법이 있는지 궁금합니다.

답변1

최근에 실행된 명령을 참조하는 경우 더 효율적인 접근 방식은 음수로 참조하는 것입니다.

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

또한 이 작업을 수행하면 마지막 기록 항목에 전체 명령 체인이 포함되므로 Repeat it 을 사용할 수 있습니다 !!.


편집하다: 이 강력한 내장 기능에 아직 익숙하지 않다면fc,자일스가 언급됨. ( 를 사용합니다 help fc.) 음수도 사용할 수 있는 것으로 나타났기 때문에 위와 같은 연산을 사용할 수 있습니다.

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

하지만 이에 대한 주의 사항이 있습니다. 그 이후에는 해당 eval줄이 마지막 명령으로 기록에 저장됩니다. 따라서 이것을 다시 실행하면 루프에 갇히게 됩니다!

더 안전한 접근 방식은 기본 fc작업 모드를 사용하는 것입니다. 즉, 선택한 명령 범위를 편집기에 전달하고 종료 후 실행합니다. 노력하다:

 fc -4 -1

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

답변2

기록에서 일련의 명령을 보려면 내장 명령을 사용하십시오.fc주문하다:

fc -ln 432 435

다시 실행하려면:

eval "$(fc -ln 432 435)"

답변3

Bash 기록에서 여러 명령을 순차적으로 실행하는 것에 대한 좋은 대안이 있습니다.
기록 바꾸기(또는)를 사용하는 대신 !432+를 사용하여 기록을 검색하고 실행하려는 첫 번째 명령을 찾은 후 +(!-4CtrlrCtrlo조치를 취하고 다음 단계를 진행하세요.) 키 대신 에 return이것이
명령을 시작하고 다음 명령을 제안합니다.역사적으로. Ctrl+o원하는 만큼 클릭하여 return마지막 시퀀스로 시퀀스를 종료하거나 Ctrl+c시작하지 않고 중지할 수 있습니다.

답변4

fcfor 루프와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

관련 정보