리눅스 fc 명령어 질문여~~

heybuddy의 이미지

안냐세여!!
더운데 다들 수고 많으시네여!!
다름이 아니라 LPIC 겅부 하고 있는데
FC란게 나왔네여!!

fc 바르샤는 아니겠고, 뭐죠??

알려주세염!!!

ydhoney의 이미지

좀 심각한 듯.

왜 답변이 안달리는지 생각해보신 적 없으십니까?

dewyangel의 이미지

Read The Manual First

System Engineer

interweb8의 이미지

요약하면, 마지막 명령어를 나타내는 것임.

fc [-e ename] [-nlr] [first] [last]
fc -s [pat=rep] [cmd]
Fix Command. In the first form, a range of commands from first to last is selected
from the history list. First and last may be specified as a string (to locate the
last command beginning with that string) or as a number (an index into the history
list, where a negative number is used as an offset from the current command number).
If last is not specified it is set to the current command for listing (so that ¡®¡®fc
-l -10¡¯¡¯ prints the last 10 commands) and to first otherwise. If first is not spec-
ified it is set to the previous command for editing and -16 for listing.

The -n option suppresses the command numbers when listing. The -r option reverses
the order of the commands. If the -l option is given, the commands are listed on
standard output. Otherwise, the editor given by ename is invoked on a file contain-
ing those commands. If ename is not given, the value of the FCEDIT variable is
used, and the value of EDITOR if FCEDIT is not set. If neither variable is set, is
used. When editing is complete, the edited commands are echoed and executed.

In the second form, command is re-executed after each instance of pat is replaced by
rep. A useful alias to use with this is ¡®¡®r="fc -s"¡¯¡¯, so that typing ¡®¡®r cc¡¯¡¯ runs
the last command beginning with ¡®¡®cc¡¯¡¯ and typing ¡®¡®r¡¯¡¯ re-executes the last com-
mand.

If the first form is used, the return value is 0 unless an invalid option is encoun-
tered or first or last specify history lines out of range. If the -e option is sup-
plied, the return value is the value of the last command executed or failure if an
error occurs with the temporary file of commands. If the second form is used, the
return status is that of the command re-executed, unless cmd does not specify a
valid history line, in which case fc returns failure.

pogusm의 이미지

# man bash 를 하면 아래와 같은 내용을 볼 수 있습니다
 
히스토리(HISTORY)
       대화형 모드에서 쉘은 이전에 입력한 명령 목록인 명령 히스토리를접근할 수
       있도록 해준다.  최근 HISTSIZE 갯수의 명령 텍스트는(기본 500) 히스토리 목
       록에 저장된다.  쉘은 각 명령에대하여 매개변수 확장과 변수 확장 전에 히스
       토리 목록에 저장한다.  ( 확장참고 ) 그러나 command_oriented_history   와
       HISTCONTROL   변수의 값에 따라 히스토리 확장을 수행한 후에 저장하기도 한
       다.  시동할 때, 히스토리는 HISTFILE 변수가 가리키는 파일로부터 초기화 된
       다.   ( 기본값 ~/.bash_history).  HISTFILESIZE 보다 커지지 않도록 필요할
       때에는 HISTFILE 파일을 잘라낸다.  내부 명령 fc ( 쉘 내부 명령참고)을  사
       용하여 히스토리를 보거나 일부 명령을 편집하여 재실행할 수 있다.  history
       내부 명령을 사용하여 히스토리 목록을 표시하고 히스토리 파일을 조작할  수
       있 다.  명령행 편집을 사용할 때 각 모드마다 히스토리 목록을 검색할 수 있
       는 명령이있다.  대화형 쉘을 종료하면 최근 HISTSIZE 행만큼이 히스토리  목
       록 으로부터 HISTFILE 로 복사된다.  HISTFILE 을 unset하거나 히스토리 파일
       에 쓸 수 없을 때는 히스토리를 저장하지 않는다.
 
 
       fc [-e 편집기이름] [-nlr] [처음] [마지막]
       fc -s [패턴=치환텍스트] [명령]
              명령을 수정한다.  첫번째 형식에서, 명령의 범위는 처음부터 마지 막
              범 위 에 있는 명령을 히스토리 목록에서 선택한다.  처음과 마지막은
              문자열(그 문자열로 시작하는 최근 명령을 찾고자 할 때) 또는 숫자 (
              히 스토리 목록의 인덱스로 사용하며 음수일 때에는 현재 명령 번호로
              부터떨어진 만큼을 뜻한다)로 명시할 수 있다.  마지막을 명시하지 않
              으면 현재 명령으로 설정되고(따라서 fc -l -10 은 최근 10 개의 명령
              을 출력하게 된다) 그렇지 않으면 처음까지 출력한다.  If 처음을  명
              시 하지 않으면 편집을 위해 이전 명령으로 설정하고 표시를 위해 -16
              을 설정한다.
 
              -n 플래그를 적으면 나열할 때 명령 번호가 나타나지 않게 한다.   -r
              플래그는 명령의 표시 순서를 반대로 한다.  -l 플래그가 있으면 명령
              을 표준 출력에 나열한다.  그렇지 않을 때에는 편집기이름이 가리 키
              는  편집기에서 이 명령들을 포함하는 파일을 열면서 시작한다.  편집
              기이름이 없으면 FCEDIT 변수의 값을 사용하며 FCEDIT 가 설정되어 있
              지  않을 때에는 EDITOR 값을 사용한다.  둘 다 설정되어 있지 않으면
              vi 를 사용한다.  편집을 마친 후에는 편집한 명령들이 화면에 표시되
              고실행된다.
 
              두 번째 형태에서, 명령은 패턴이 치환텍스트로 교체된 후에다시 실행
              된다.  유용한 앨리어스로는 ‘‘r=fc -s’’가 있다.  앨리어스 적용  후
              ‘‘r cc’’ 라고 치면 ‘‘cc’’로 시작하는 최근 명령을 실행하고 ‘‘r’’이
              라고치면 마지막 명령을 다시 실행하게 된다.
 
              첫번째 형태를 사용하면 잘못된 옵션이 있거나 처음또는 마지막이  히
              스토리 행 범위를 벗어나지만 않으면 반환값 0 을 갖는다.  -e 옵션을
              주면 마지막 실행 명령의 값이 반환값이 되거나 명령의 임시 파일에서
              오류가 발생하는 경우 실패 값을 가진다.  두번째 형태를 사용하면 명
              령이 유효한 히스토리 행을 가리키지 못하여 fc 가 실패를 반환 하 는
              경우가 아니라면 재실행한 명령의 반환값을 반환값으로사용한다.

# history [엔터] 를 해보면 입력한 명령어 history가 모두 출력됩니다 (# fc -l -1000 과 동일
( # echo $HISTSIZE
1000
제 시스템의 HISTSIZE는 1000 이기때문에....)

# fc -l [엔터] 를 해보면 최근 16개의 명령어 history가 출력됩니다 (# fc -l -16 과 동일)

# fc -l 900 [엔터] 를 하면, 900행부터 최근명령어까지의 history가 출력됩니다

# fc -l -10 [엔터] 를 하면 최근 10개의 history가 출력됩니다

# fc -l 900 910 [엔터]를 하면, 900행~910행 까지의 history가 출력됩니다

# fc [엔터] 를 해보면, vi에디터가 실행되는데, 다른 쉘(터미널)을 열어서 # ps -ef | grep fc 라고 해보면
# ps -ef | grep fc
root 3783 3423 0 23:12 pts/3 00:00:00 vi /tmp/bash-fc-63611622217
root 3785 3718 0 23:12 pts/4 00:00:00 grep fc
위와 같습니다..

fc 의 유용한 활용법은 위의 메뉴얼에서 나온 fc -s 명령입니다..

예를 들어 히스토리에
tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$13}'
라는 명령이 있을때...

# fc -s tail 이라고만 입력해주면, history에 있는 가장 최근의 'tail'으로 시작되는 명령을 재실행해줍니다..

뭐, 그냥 키보드 방향키로 위/아래 키를 눌러서 history내 명령어를 조회하고 실행할수도 있으니..
fc를 모른다고해도 크게 문제는 없을 거 같습니다..

ps. 저도 fc명령어는 이번기회에 알았네요..

추가 :
fc 편집모드 사용법

# fc -l -10
1014 fc -l -10
1015 fc -l 1000
1016 fc -l -1000
1017 tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$13}'
1018 tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$13}'
1019 tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$11}'
1020 tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$15}'
1021 tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$13}' <--- 이걸 수정실행하고싶을때
1022 fc -l -1000
1023 fc -l -1000

# fc 1021 를 하게되면, vi편집기가 열리면서 1021행 명령을 편집할 수 있습니다

1021 tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$16}' 이라고 수정후 vi 명령어 ':wq' (저장/종료) 를 입력하게되면

쉘에서 tail -f /var/log/httpd/access_log | awk '{print $1,$2,$3,$16}' 라는 명령어가 실행됨.

# fc 1017 1021 를 하게되면, 1017-1021 행을 동시에 수정/실행 할 수 있음. vi 편집모드를 저장/종료하게되면
1017-1021행의 다섯명령어가 순서대로 실행됨.

# fc [엔터] 하게 되면, 마지막행( 1023 fc -l -1000 ) 명령어를 수정/실행 할 수 있다