본문 바로가기
컴퓨터과학[3-2]/U.N.I.X

UNIX - [제9강] 프로세스 관리 명령(2) & 쉘

by boolean 2016. 7. 19.
728x90

UNIX - [제9강] 프로세스 관리 명령(2) & 쉘

● 백그라운드/포어그라운드 프로세스 ● 프로세스 모니터링/관리 명령 ● 쉘의 종류와 기능 ● 쉘의 환경 설정

UNIX 용어정리

  • 백그라운드 프로세스
    쉘 프롬프트에서 커맨드 뒤에 앰퍼샌드(&)를 입력하고 실행하면, 커맨드가 백그라운드 프로세스로 분리되어 실행된다. 백그라운드 프로세스가 실행 중이라도 다음 커맨드를 계속 실행시킬 수 있다. 백그라운드 프로세스는 해당 터미널로의 출력은 가능하나 키보드 입력을 받을 수 없다.
  • 시그날
    시그날은 어떤 상황이 일어났음을 프로세스에게 알려주기 위한 것이다. 다른 프로세스(통신 수단으로), 터미널 드라이버(특정 키를 입력할 때), 관리자(프로세스 관리), 커널(실행 오류나 특정 조건이 일어날 때)이 시그날을 보낼 수 있다.
  • 리눅스 시스템에서 사용자의 커맨드를 해석하여 처리해 주는 프로그램으로 사용자와 운영체제의 커널을 연결시켜 주는 대화형 사용자 인터페이스이다.
  • 환경변수
    환경 변수는 쉘 환경에서 사용되는 변수로 보통 전역 변수를 의미한다. 로컬 변수는 만들어진 쉘에서만 사용 가능하고 환경 변수는 자식 쉘에서도 사용 가능하다. 시스템이 부팅될 때 자동으로 많은 환경 변수(키워드 쉘 변수라 함)의 설정이 이루어진다.

요점정리

  1. 백그라운드 프로세스와 포어그라운드 프로세스의 차이를 설명하시오.
    • 백그라운드(background) 프로세스
      프롬프트에서 명령 &로 실행한 프로세스로 키보드 입력을 받을 수 없다.
      백그라운드로 프로세스를 실행시키면 쉘은 즉시 명령 대기 상태가 되는데 키보드 입력 없이 장시간 실행되어야 하는 경우 주로 사용한다. 백그라운드 프로세스도 화면 출력은 가능하다. 포어그라운드로 전환하는 방법은 쉘에서 fg 명령을 실행한다. ps 명령을 이용하여 백그라운드 프로세스의 상태를 점검할 수 있다.
    • 포어그라운드(foreground) 프로세스
      쉘 프롬프트에서 & 없이 명령을 실행한 프로세스로 키보드 입력을 받을 수 있다. 프로세스가 포어그라운드로 실행 될 때 쉘에서 <Ctrl>+<Z> 키를 누르면 백그라운드로 전환된다.
  2. 프로세스 모니터링 명령과 프로세스 관리 명령이 어떤 것이 있는지 기술하시오.
    • ps
      실행 중인 프로세스에 관한 정보를 보여줌
    • top
      시스템에서 실행되고 있는 프로세스들의 실시간 정보를 보여줌
    • kill / killall
      프로세스에 종료하라고 시그널(기본 SIGTERM)을 보냄, kill은 PID로 프로세스를 지정, killall은 명령 이름으로 지정
    • exec
      exec 명령을 호출하는 프로세스를 새로운 프로그램을 수행하도록 변경
    • nice
      프로세스를 실행할 때 우선순위 값을 설정
    • nohup
      터미널을 빠져나가도(예 : 로그아웃) 실행 중인 프로그램을 종료되지 않고 계속 수행되게 함
    • cron 데몬, /etc/crontab 파일, crontab 명령
      특정 시간에 특정 작업을 자동으로 수행하도록 지정
  3. 유닉스 시스템의 데몬이 무엇인지 설명하고 어떤 데몬이 있는지 알아보시오.
    • 데몬(daemon)은 백그라운드로 실행되며 커널 요청 시 작동하는 프로세스이다. 주로 시스템의 서비스를 제공한다.
    • 주요 데몬은 crond(시간에 따라 등록된 명령을 정기적으로 실행하는 데몬), httpd(웹 서버), sendmail(메일 전송 서버), sshd(시큐어 쉘), atd(명령 예약 기능), cupsd(프린팅 시스템 데몬), iscsid(Internet Small Computer System Interface 데몬), pcscd(스마트 카드 데몬) 등이 있다. 자세한 데몬의 종류는 교재를 참고할 것.
  4. 쉘이 무엇인지 설명하고 대표적인 쉘의 종류는 어떤 것이 있는지 나열하시오. 그리고 사용자의 쉘을 변경하는 방법은 무엇인가?
    • 쉘은 리눅스의 대화형 사용자 인터페이스로서 명령어를 해석하여 운영체제에 전달하는 역할을 한다. 쉘 명령어로 스크립트를 작성하여 여러 명령을 조합하여 실행하거나 일괄 작업을 수행할 수 있다.
    • 대표적인 쉘의 종류는 다음과 같다.
      Bourn Shell : 실행명령은 sh, 초기설정은 .profile 파일
      C Shell : 실행명령은 csh, 초기설정은 .cshrc 파일
      Korn Shell : 실행명령은 ksh, 초기설정은 .kshrc 파일
      Bourn Again Shell : 실행명령은 bash, 초기설정은 .bashrc 파일
    • 사용자 쉘은 /etc/passwd 파일을 수정하거나 ‘usermod -s <쉘명령경로> <사용자명>’으로 변경 가능하다.
      일시적으로 다른 쉘을 사용하기 위해서는 쉘 실행명령을 사용한다.
      쉘을 변경하는 예는 다음과 같다.
      /etc/passwd 파일 - nipark:x:502:502::/home/nipark:/bin/csh
      usermod 명령 - usermod -s /bin/csh nipark)
      일시적 사용 - 명령 프롬프트에서 csh 입력
  5. 쉘에서 사용하는 편리한 특수 키 기능과 특수 기호가 무엇이 있는지 기술하시오.
    • 특수 키는 명령어의 일부만 입력하면 나머지 부분을 완성해 주는 <Tab>키와 파일 이름의 일부만 입력하면 나머지 부분을 완성해 주는 <Esc> 키가 있다.
    • ! 기호
      ‘! <history번호>’를 입력하면 이전에 실행한 명령 중 <history번호>에 해당하는 것이 다시 실행된다. <history번호>는 history 명령으로 확인할 수 있다.
    • * 기호
      Wildcard 문자이다. 문자 수와 관계없이 모든 문자열 패턴을 의미한다.
      단, ‘.’으로 시작하는 문자열은 해당되지 않는다.
      * 문자를 사용한 명령의 예는 다음과 같다.
      cat *.txt (현재 디렉터리의 .txt로 끝나는 모든 파일의 내용을 보여줌)
      ls * (현재 디렉터리에서 이름이 '.'으로 시작하는 것을 제외한 모든 파일 또는 디렉터리의 목록을 보여준다. 즉, ‘.’, ‘..’, ‘.bashrc’ 등은 해당되지 않는다.)
    • ? 기호
      임의의 한 문자에 해당하는 패턴이다.
      ? 문자를 사용한 명령의 예는 다음과 같다.
      tar cvf a.tar a? (현재 디렉터리에서 이름이 a로 시작하고 두 글자인 모든 파일을 a.tar 아카이브 파일에 묶는다.)
    • > 기호
      Output redirection이다. ‘명령 > <파일명>’으로 명령의 표준 출력을 <파일명>으로 재 지정한다. 명령을 수행할 때 화면에 출력되는 내용이 파일로 저장된다.
    • < 기호
      Input redirection이다. ‘명령 < <파일명>’으로 명령의 표준 입력을 <파일명>으로 재 지정한다. 명령을 수행할 때 키보드에서 입력받을 내용을 파일에서 읽어 들인다.
    • | 기호
      Pipe 기능이다. 앞의 명령의 표준 출력을 다음 명령의 표준 입력과 연결한다.
      ‘<명령1> | <명령2>’는 <명령1>의 수행할 때 출력되는 내용이 <명령2>의 입력으로 주어진다.
    • $ 기호
      변수 내용을 접근하는 기호이다. 변수 값을 지정할 때는 변수이름 앞에 $ 기호를 쓰지 않지만 변수 값을 의미할 때는 변수이름 앞에 $ 기호를 붙인다.
    • # 기호
      주석을 의미한다. 쉘은 명령행의 # 기호 이후는 해석하지 않는다.
    • & 기호
      명령을 백그라운드로 실행하는 기호이다. ‘<명령>&’는 <명령>을 포어그라운드가 아닌 백그라운드로 실행한다.
    • ~ 기호
      홈 디렉터리를 의미한다.
    • { } 기호
      인수 등을 나타내는데 사용된다.

연습문제

  • 연습문제1
    쉘에서 포어그라운드로 실행되는 프로세스를 stopped로 전환시키는 키는?
    답을 체크하세요
    정답 :
    해설 : <Ctrl>+<Z>로 포어그라운드 프로세스를 백그라운드의 stopped 상태로 전환시킬 수 있고, 이어서 ‘bg’ 명령을 수행하면 해당 프로세스가 백그라운드로 실행될 수 있다.
  • 연습문제2
    터미널을 빠져나가도 백그라운드에서 실행 중인 프로그램이 종료되지 않고 계속 수행되게 해 주는 명령어는?
    답을 체크하세요
    정답 :
    해설 : 터미널이 종료되면 해당 터미널에서 수행되는 백그라운드 프로세스가 같이 종료된다.
    nohup 명령은 터미널과 무관하게 백그라운드 프로세스가 스스로 종료될 때까지 계속 수행되게 해 주는 명령어이다.
  • 연습문제3
    다음 crontab 파일의 필드 표현 중에서 매주 월요일에 한번만 명령을 수행하게 하는 것은?
    답을 체크하세요
    정답 :
    해설 : ③이 일, 월에 관계없이(3~4번째 *) 월요일(5번 째 1)의 1시 1분에 명령을 수행하게 한다.
  • 연습문제4
    다음 중 쉘에서 한 프로세스의 출력을 다른 프로세스의 입력으로 넘겨주는 파이프 기능을 의미하는 기호는?
    답을 체크하세요
    정답 :
    해설 : Pipe 기호는 | 이다.
  • 연습문제5
    쉘에서 ‘$PS1’ 환경변수 값에 들어있는 내용은?
    답을 체크하세요
    정답 :
    해설 : PS1은 명령 프롬프트의 형식을 지정하는 환경 변수이다.
    ‘$echo $PS1’을 실행시켜 보면 [ \u@ \h \W] \$와 같은 값이 설정되어 있는데 \u는 사용자 계정, \h는 호스트이름, \W는 작업 디렉터리의 이름을 의미한다.


pratical centos 리눅스 활용 교재 연습문제 풀이

9강. 프로세스 관리 명령(2) & 쉘
l 포어그라운드(foreground) 프로세스
Ÿ 쉘 프롬프트에서 명령을 입력하고 하면 포어그라운드 모드로 실행됨
Ÿ 포어그라운드 프로세스는 키보드 입력 받기와 화면 출력이 가능함
Ÿ 포어그라운드로 실행 중인 프로세스의 강제 중지는 +
Ÿ 포어그라운드로 실행 중에
Ÿ ‘fg jobId ’ 또는 ‘bg jobId ’ 명령을 수행하면 Stopped 백그라운드 프로세스가 실행상태가
+하면 백그라운드로 전환되며 Stopped 상태가 됨
될 수 있음
l 백그라운드(background) 프로세스
Ÿ 쉘 프롬프트에서 명령 뒤에 ‘&’를 적고 하면 백그라운드로 실행됨
Ÿ 백그라운드로 프로세스를 실행시키면 쉘은 즉시 명령 대기 상태가 됨
Ÿ 백그라운드 프로세스는 키보드 입력을 받을 수 없음
Ÿ 입력 없이 장시간 실행되어야 하는 경우 주로 사용
Ÿ 포어그라운드로 전환시키려면 쉘에서 ‘fg jobId’ 명령을 실행
Ÿ jobs 명령으로 백그라운드 프로세스의 상태를 점검할 수 있음
l 프로세스 모니터링 명령 - ps
Ÿ 실행 중인 프로세스에 관한 정보를 보여줌
Ÿ ps 명령의 사용 방법과 옵션
ps [옵션]
∘ l : 세부적인 정보 (교재 참고)
∘ a : 다른 사용자의 프로세스 포함
∘ u : 상세한 사용(자)정보 포함
∘ x : 터미널(tty)이 할당되지 않은 프로세스 포함
∘ -p pid : PID가 pid 인 프로세스만 해당
∘ -u uid : UID(또는 사용자계정)가 uid 인 사용자의 프로세스만 해당
l 프로세스 모니터링 명령 - top
Ÿ 프로세스 모니터링과 프로세스 관리를 위한 대화식 툴
Ÿ 시스템에서 실행되고 있는 프로세스들의 실시간 정보(3초 간격)를 보여줌
Ÿ 전체적 CPU 사용, 메모리 사용, 시스템 부하 등과 개별 프로세스의 실행 현황 등
Ÿ 윈도우의 작업 관리자와 비슷함
Ÿ top 명령의 사용 방법과 옵션
top [옵션]
∘ top의 대화식 서브 명령
∘ h : 도움 화면
∘ d : 화면 갱신 주기 조정∘ u : 특정 사용자의 프로세스로 한정
∘ r : 우선 순위 조정(renice)
∘ k : 특정 프로세스(PID)를 kill
l 프로세스 관리 명령 - kil/killall
Ÿ kill 명령은 프로세스에 시그널(기본 SIGTERM)을 보내는 명령
Ÿ kill 명령은 대상 프로세스를 PID로 지정함. killall 명령은 명령 이름으로 지정함
Ÿ kill 명령의 사용 방법과 옵션
kill [옵션] pid
∘ -s signal
또는 -signal : 프로세스에 signal 시그널을 보냄 (SIGHUP, SIGKILL 등의 이
름 또는 시그널의 번호)
∘ -l : 지정 가능한 시그널 이름을 보여줌
Ÿ
killall 명령의 사용 방법
killall [옵션] 명령이름 : 여러 프로세스를 kill시킬 수 있으므로 주의해야 함
l 프로세스 관리 명령 - exec
Ÿ
exec 명령을 호출하는 프로세스를 새로운 프로그램을 수행하도록 변경
-새로운 프로세스를 만들지 않고 새로운 명령을 수행하는 프로세스로 바꾸는 것
-쉘에서 exec 명령을 실행하면 명령의 실행이 종료된 후 쉘이 종료됨
Ÿ
exec 명령의 사용 방법
exec [[옵션] 명령 [인수] ]
∘ 예: exec top
l 프로세스 관리 명령 - nice (관련 명령 renice)
Ÿ 프로세스를 실행할 때 우선순위 값을 설정
Ÿ nice를 통해 조정될 수 있는 범위
∘ -20(가장 높은 우선권)에서 +19(가장 낮은 우선권)까지, 기본은 0
∘ 일반 사용자는 자신의 프로세스를 0 이상으로만 지정 가능
Ÿ
nice 명령의 사용 방법과 옵션
nice [옵션] [명령 [인수]]
∘ -n adjustment 또는 –adjustment : 조정 수치를 adjustment 로 지정
∘ 실행 예: nice –n +5 top 또는 nice -+5 top
Ÿ
renice 명령은 이미 실행 중인 프로세스의 우선순위 값을 설정
∘ 실행 예: renice +5 –p PID
l 프로세스 관리 명령 - nohup
Ÿ 터미널을 빠져나가도(예: 로그아웃) 실행 중인 프로그램을 종료되지 않고 계속 수행되게 함
Ÿ nohup으로 명령을 실행하는 경우 명령 행의 끝에 ‘&’를 붙여 백그라운드로 실행하고 로
그아웃 함
Ÿ
nohup 명령의 사용 방법
∘ nohup 명령 [인수]∘ 실행 예: nohup find / -name core –print > corefiles.out &
l 프로세스 관리 명령 - cron
Ÿ 특정 시간에 특정 작업을 자동으로 수행하도록 지정 가능
Ÿ crond에 의해 수행될 작업 목록을 작성해야 함
Ÿ 일반적으로 수행될 작업을 스크립트로 작성해 두고, 스크립트를 수행하도록 함
Ÿ cron을 이용한 자동 스케줄과 /etc/crontab 파일 : 시스템 수준에서 주기적으로 수행될
작업을 설정
Ÿ
crontab 명령 : 개별 사용자는 crontab 명령을 이용하여 주기적으로 수행될 작업을 설정
할 수 있음
l crontab 파일
∘ 작성 예
02 4 * * * root run-parts /etc/cron.daily
Ÿ
crontab 파일에서 필드가 표현하는 값(왼쪽부터)
∘ 분 : 0-59, *
∘ 시간 : 0-23, *
∘ 일 : 1-31, *
∘ 월 : 1-12, *
∘ 요일 : 0-6(0=일요일)
∘ run-parts는 해당 디렉터리에 있는 명령을 수행하는 명령
Ÿ
crontab 명령의 사용 방법과 옵션
crontab [-u 사용자ID] [옵션]
∘ -l : crontab 파일 내용 보기
∘ -e : crontab 파일 편집
∘ -r : crontab 파일 삭제
∘ 예: ‘0 4 1-10 * * 명령1’은 매월 1일부터 10까지 매일 4시 0분에 ‘명령1’을 수행
∘ 예: ‘* * * * * date >> ~/date.txt’는 1분 간격으로 시간을 홈디렉터리의 date.txt에 추
가
l crontab 명령 사용 예
Ÿ crontab –e (crontab 파일 생성)
Ÿ ‘* * * * * date >> ~/date.txt’을 작성하고 저장 후 종료
Ÿ crontab –l (crontab 파일 확인)
Ÿ cat ~/date.txt (홈디렉터리의 date.txt 파일을 확인)
Wed Sep 28 14:00:02 KST 2011
Wed Sep 28 14:01:01 KST 2011
Ÿ
crontab –r (crontab 파일 삭제)
l 데몬
Ÿ
백그라운드로 실행되며 커널 요청 시 작동하는 프로세스Ÿ
주로 시스템의 서비스를 제공
l 주요 데몬의 종류와 기능
Ÿ crond : 시간에 따라 등록된 명령을 정기적으로 실행
Ÿ dhcp : 동적인 IP 주소와 네트워크 정보를 지원
Ÿ httpd : 웹 서버
Ÿ lpd : 프린트 작업 처리
Ÿ sendmail : 메일 전송 서버
l 쉘 개요
Ÿ 쉘은 리눅스의 대화형 사용자 인터페이스
Ÿ 쉘은 명령어 해석기로 사용자의 명령을 해석하여 운영체제에 전달하고 명령 수행 결과를
보여줌
Ÿ 쉘은 스크립트를 해석하여 실행시킬 수 있음
Ÿ 쉘 스크립트는 프로그램과 유사함
l 쉘의 종류
Ÿ
Bourne Shell (sh)
-UNIX 시스템의 표준 구성 요소
-Bourne Shell 프로그램의 실행명령어 : sh
-'.profile' 파일로 환경을 초기화
Ÿ
C Shell (csh)
-C Shell 프로그램의 실행 명령어 : csh
-커맨드 구조에서 C 언어와 유사
-편리한 기능도 내장하고 있어서 많이 보급됨
-'.cshrc' 파일로 환경을 초기화
Ÿ
Korn Shell (ksh)
-Bourne Shell과 완전히 호환
-'.kshrc' 파일로 환경을 초기화
Ÿ
Bash Shell (bash)
-FSF(Free Software Foundation)에서 개발한 무료 공개용 쉘
-Korn Shell과 C Shell의 유용한 특징들을 통합
-대부분의 리눅스 기계에서의 표준적인 명령어 라인 인터페이스
-리눅스에서 처음 로그인을 하였을 때 기본으로 주어지는 쉘
-'.bashrc' 파일로 환경을 초기화
l 사용자 쉘 확인 및 변경
Ÿ
/etc/passwd 파일 수정 예 (기본 쉘로 C Shell을 사용하도록 함)
nipark:x:502:502::/home/nipark:/bin/csh
∘ 해당 사용자의 로그인을 막으려고 할 때는 마지막 필드를 /bin/false로Ÿ
사용하는 쉘을 확인하는 방법
∘ echo $SHELL 명령을 수행
Ÿ
일시적으로 쉘을 변경하기
∘ sh, csh, ksh, 또는 bash 명령을 수행
∘ 원래의 쉘로 돌아오려면 exit 명령을 수행
l 쉘의 명령 완성 기능
Ÿ 명령어 일부만 입력하고  키를 누름
Ÿ 입력하지 않은 부분의 내용을 자동으로 생성해 줌
Ÿ 해당 명령어가 두 개 이상이면 명령어의 리스트를 모두 보여줌
l 쉘의 파일 이름 완성 기능
Ÿ 파일 이름의 일부만 입력하고  키를 누름
Ÿ 입력하지 않은 부분의 내용을 자동으로 완성해 줌
Ÿ 해당 파일이 두 개 이상이면 공통부분까지 만 완성
l 쉘의 History 기능
Ÿ 쉘 프롬프트에서 history 명령 또는 위, 아래 커서 키 사용
Ÿ ! history번호  또는 위/아래 화살표로 이동하여 
Ÿ history 파일
∘ ~/.bash_history (저장된 명령어 개수는 HISTSIZE 변수에 지정)
Ÿ
파일 이름에서 메타 문자의 지원
∘ '?' : 임의의 한 문자, '*' : 문자 수와 상관없는 임의의 문자
∘ 예: rm *.bak (파일들의 확장자가 'bak'으로 끝나는 파일 삭제
l 쉘에서 사용하는 특수 문자
Ÿ > : 표준 출력을 기록할 파일 지정
Ÿ ls > result
Ÿ >> : 표준 출력을 덧붙일 파일 지정
Ÿ < : 표준 입력을 읽을 파일 지정
Ÿ * : 0개 이상의 문자와 대응
Ÿ ? : 하나의 문자와 대응
Ÿ | : 어떤 프로세스의 출력을 다른 프로세스의 입력으로 보냄 (파이프)
∘ 예: cat file1 file2 | sort | more
Ÿ ; : 명령 순서
Ÿ || : 이전 명령이 실패하면 실행하는 조건부 실행
Ÿ && : 이전 명령이 성공하면 실행하는 조건부 실행
Ÿ & : 명령을 백그라운드 프로세스로 실행
Ÿ # : 주석 처리
Ÿ $ : 변수 접근 기호
∘ 예: echo $PATH $LANGl 쉘의 환경 설정
Ÿ 쉘 환경 설정 파일은 사용자의 홈 디렉터리에 존재
Ÿ 파일의 이름은 rc(Resource Configuration)
Ÿ 환경설정 파일의 종류
∘ /etc/profile : 로그인 쉘로 로그인할 때 실행됨, 모든 사용자에게 영향
∘ ~/.bash_profile : 로그인 쉘로 로그인할 때 실행됨. 개별 사용자가 설정
∘ /etc/bashrc : 보통 ~/.bashrc에서 호출됨
∘ ~/.bashrc : 새로운 쉘이 실행될 때 설정
∘ ~/.bash_logout : 마지막 쉘이 종료되면서 실행
l 쉘의 환경 변수
Ÿ
주요 환경 변수
$HOME : 사용자 홈 디렉터리 $PATH : 명령어 프로그램 탐색 경로
$MAIL : 메일 보관함 경로 $MAILCHECK : 메일 확인 간격(초)
$SHELL : 현재 쉘의 경로$HOSTNAME : 컴퓨터 이름
$PWD : 현재 디렉터리 $PS1 : 프롬프트
$UID : 사용자 UID $USER : 사용자 이름
$HISTFILE : 히스토리 파일 $LANG : 사용 언어
Ÿ
환경 변수 값 확인
∘ echo $환경변수
Ÿ
환경 변수 값을 모두 확인
∘ printenv
Ÿ
환경 변수 값 설정
∘ export [환경변수 [= 변수값] ]
Ÿ
일반 변수 값 설정
∘ 변수 = 변수값 (set 명령으로 값을 모두 확인)
l 다음 문제의 정답을 고르시오.
11. 다음 리눅스 명령어 중 bash 쉘의 내장 명령이 아닌 것은?
1 cd 2 alias
3 echo 4 rm
12. 다음 쉘의 기본 개념 설명 가운데 옳지 않은 것은?
1 쉘은 CPU를 직접 제어한다.
2 쉘은 커널과 통신한다.
3 사용자가 입력한 내용은 디바이스 드라이버를 통과한다.
4 쉘은 사용자의 지시를 수신한다.
14. BASH에서 다음 중 쉘에 의해 자동으로 설정되는 변수가 아닌 것은?
1 PPID
2 PWD  3 OSTYPE
4 MYNAME
15. 다음 쉘 가운데 리눅스의 기본 쉘이며 가장 많이 사용되는 것은?
1 csh 2 bash
3 kxh 4 tcsh


댓글