본문 바로가기

좋아하는 것_매직IT/99.업무자동화하기

bash 쉘에서 예전에 실행했던 명령들을 한꺼번에 다시 실행하기(feat.fc 명령)

반응형


우선, 예전에 자신이 실행했던 명령을 다시 실행하려면 어떻게 해야할까요?
정답) 위쪽 화살표키↑를 써서 찾으면됩니다.

그럼, bash에서 직전에 실행했던 명령을 다시 실행하려면 어떻게 해야할까요?
정답) 쉘에서 느낌표를 두 번(!!) 누르고 엔터를 치면 됩니다.
ex) $ !!

화살표로 찾기 어려울 정도로 이전의 명령어라면요 어떻게 해야할까요?
history에서 찾아서 해당 번호를 알아내고 ...
번호로 실행합니다. history에 45번으로 나왔으면 
ex)
$ history (번호찾고...)
$ !45

그럼, bash 쉘에서 예전에 실행했던 명령들을 한꺼번에 다시 실행하려면 어떻게 해야 할까요?
정답) bash에서는 fc 명령을 쓰면 됩니다.

fc -e true 시작번호 끝번호

예를 들어 히스토리에서 20번째부터 25번째까지 명령을 다시 실행하려면

fc -e true 20 25

그런데 말입니다. 만약 e 옵션을 안 붙이면 어떻게 될까요?
정답) vi 등의 에디터가 뜨고 명령 목록이 보입니다. 에디터를 닫을 때 남아있는 명령들이 실행됩니다.

그럼, 여기서 더 나아가 fc 에대해서 좀더 알아보겠습니다. 

fc 명령

용도 
 - fc 명령의 용도는 명령 히스토리 리스트를 처리합니다.

구문

1. 이전에 입력된 명령을 수정하고 재실행하기 위해 편집기를 열려는 경우는 아래와 같이 사용하시면됩니다. 
  $ fc [ -r ] [ -e Editor ] [ First [ Last ] ]

2. 이전에 입력된 명령의 리스트를 생성하려는 경우는 아래와 같이 사용하시면됩니다. 
  $ fc -l [ -n ] [ -r ] [ First [ Last ] ]

3. 실행 시간과 함께 이전에 입력된 명령의 리스트를 생성하려는 경우는 아래와 같이 사용하시면됩니다. 
  $ fc -t [ -n ] [ -r ] [ First [ Last ] ]

이전에 입력된 명령을 재실행하려는 경우는 아래와 같이 사용하시면됩니다. 
 $ fc -s [ Old= New ] [ First ]

간단한 설명

fc 명령은 사용자의 히스토리 파일의 내용을 표시하거나 이전에 쉘에 입력된 명령을 재실행하기 위해 편집기를 호출합니다. 
그리고, 명령 히스토리 파일은 번호순으로 명령을 나열합니다.
즉, 리스트의 첫 번째 번호는 임의로 선택됩니다.
명령에 대한 번호의 관계는 사용자가 로그인하고 다른 프로세스가 리스트에 액세스하고 있지 않을 때를 제외하고 변경되지 않습니다.
이 경우 시스템은 가장 오래된 보유 명령을 1에서 시작하도록 번호 지정을 재설정합니다.

그런데 말입니다.
만약, 명령 히스토리 파일의 번호가 HISTSIZE 환경 변수의 값 또는 32767 중 더 큰 값을 초과한 한계에 도달하는 경우는 어떻게 될까요??
쉘은 1로 랩핑됩니다.
이 선택적 번호 랩핑에도 불구하고 fc 명령은 명령의 시간 시퀀스 지정 시퀀스를 유지합니다.
예를 들어, 시퀀스의 세 명령에 번호 32766, 32767 및 1(랩핑됨)이 지정되는 경우 명령 32767이 여전히 명령 1보다 이전인 것으로 간주된다고 하네요..

그리고, 히스토리 파일의 명령은 -l(L의 소문자) 플래그를 사용하여 표시될 수 있습니다.
-l 플래그가 지정되지 않고 명령이 -e Editor 플래그를 사용하여 편집되는 경우 결과 행은 히스토리 파일의 끝에 입력되어 쉘에 의해 재실행된다고 하고요
(fc -e Editor 명령이 명령 히스토리 리스트에 입력되지 않음).

그리고, 편집기가 제로가 아닌 종료 상태를 리턴하는 경우 이는 히스토리 파일의 항목과 명령 재실행을 억제합니다.

모든 명령행 변수 지정 또는 fc 명령과 함께 사용되는 방향 재지정 연산자는 다시 이전 명령을 호출하여 fc 명령 및 이전 명령에 대한 표준 오류를 억제합니다. 예를 들면, 다음과 같습니다.

fc -s -- -1 2>/dev/null

 
좀더 자세한 사항은 man 페이지를 보시면 좋을것 같네요~~

오늘 블로그는 여기까지고요..
항상 믿고봐주셔서 감사합니다.

728x90
300x250