Shell의 기능
명령어 해석기
- 사용자와 커널 사이에서 명령을 해석하여 전달하는 해석기(Interpreter)와 번역기(Translator) 기능
- 사용자가 로그인하면 셸이 자동으로 실행되어 사용자가 명령을 입력하기를 기다림 → 로그인 셸
- 로그인 셸 - /etc/passwd 파일에 사용자별로 지정
- 프롬프트: 셸이 사용자의 명령을 기다리고 있음을 나타내는 표시
프로그래밍 기능
- 셸은 자체 프로그래밍 기능이 있어 반복적으로 수행하는 작업을 하나의 프로그램으로 작성 가능
- 이러한 셸 프로그램을 셸 스크립트라고 지칭
사용자 환경 설정 기능
- 사용자 환경을 설정할 수 있도록 초기화 파일 기능 제공
- 초기화 파일 기능
- 명령을 찾아오는 경로 설정
- 파일과 디렉터리를 새로 생성할 때 기본 권한 설정
- 다양한 환경 변수 등을 설정
Shell의 종류
Bourne Shell($)
- 유닉스 V7에 처음 등장
- 개발자 스티븐 본의 이름을 땄음
- 초기에 단순하고 처리 속도가 빨라 많이 사용
- 경로를 확인해보면 배시 셸과 심벌릭 링크로 연결되어 있음
- 지금도 시스템 관리 작업을 수행하는 많은 셸 스크립트는 본 셸을 기반으로 함
- 히스토리, alias, 작업 제어 등 사용자 편의를 위한 기능을 제공하지 못해 이후에 다른 셸들이 등장
C Shell(%)
- 캘리포니아 버클리 캠퍼스의 빌 조이가 개발
- 2BSD 유닉스에 포함되어 발표
- 본 셸에는 없던 alias나 히스토리 같은 사용자 편의 기능 포함
- 셸 스크립트 작성을 위한 구문 형식이 C 언어와 같아 C 셸이라는 이름을 가지게 됨
Korn Shell($)
- 1980년대 중반 AT&T 벨 연구소의 데이비드 콘이 개발
- 유닉스 SVR 4에 포함되어 발표
- C 셸과 달리 본 셸과의 호환성을 유지하고 히스토리, alias 기능 등 C 셸의 특징도 모두 제공하면서 처리 속도도 빠름
Bash Shell($)
- 본 셸을 기반으로 개발된 셸
- 1988년 브레인 폭스가 개발
- 본 셸과 호환성을 유지하면서 C 셸, 콘 셸의 편리한 기능도 포함
- 모든 버전은 GPL 라이선스에 의거하여 자유롭게 사용 가능
- 리눅스의 기본 셸로 제공
Shell의 기본 사용법
기본 Shell 변경
- 사용자 정보 확인: /etc/passwd 파일로 기본 셸 확인 가능
- 기본 셸 변경: chsh [옵션] [사용자명]
- -s shell: 지정한 셸(절대 경로)로 로그인 셸을 바꾸는 옵션
- -l: /etc/shells 파일에 지정된 셸을 출력하는 옵션
- 프롬프트에서 다른 셸을 실행할 수 있는데, 이를 서브 셸이라고 함
- 서브 셸은 또 다른 서브 셸 생성 가능
- 서브 셸 종료 명령: ^d(ctrl+d), exit 등
- 서브 셸이 종료되면 서브 셸을 실행했던 이전 셸 환경으로 복귀
- 로그인 셸에서 로그아웃하면 서브 셸도 접속 해제
Shell 내장 명령
- 셸은 자체적으로 내장 명령을 가지고 있음
- 셸 내장 명령은 별도의 실행 파일이 없고 셸 안에 포함(cd 등)
- 일반 명령(실행 파일)의 경우 실행파일은 바이너리 파일이므로 cat 명령으로 파일의 내용을 확인할 수 없음
Shell 출력 명령(Bash)
- echo [옵션] [문자열]: 화면에 한 줄의 문자열을 출력
- printf [옵션] [인수]: % 지시자와 \ 문자를 이용하여 출력 형식을 지정 가능
특수문자 사용
- 사용자가 더욱 편리하게 명령을 입력하고 실행할 수 있도록 다양한 특수문자 제공(*, ?, |, ;, [], 등)
- 명령을 입력하면 셸은 먼저 특수문자가 있는지 확인하고 이를 적절한 형태로 변경한 후 명령을 실행
- * : 임의의 문자열을 나타내는 특수문자, 0개 이상의 문자로 대체
- ?, [] : 하나의 문자를 나타내는 데 사용
- ?는 길이가 1인 임의의 한 문자를, []는 괄호 안에 포함된 문자 중 하나를 나타냄
- ~, - : 디렉터리를 나타내는 특수문자
- ; : 연결된 명령을 왼쪽부터 차례로 실행
- | : 왼쪽 명령의 실행 결과를 오른쪽 명령의 입력으로 전달
- '', "" : 문자를 감싸서 문자열로 만들어주고, 문자열 안에 사용된 특수 문자의 기능을 없앰
- 작은 따옴표는 모든 특수 문자를, 큰 따옴표는 $, `, \를 제외한 모든 특수 문자를 일반 문자로 간주
- "` `" : 감싸인 문자열을 명령으로 해석하여 명령의 실행 결과로 전환
- \ : 특수문자 바로 앞에 사용하며 특수문자의 효과를 없애고 일반 문자처럼 처리
- >, <, >> : 입출력의 방향을 바꿈
입출력 방향 바꾸기
- 표준 입력 장치: 셸이 작업을 수행하는 데 필요한 정보를 받아들이는 장치(키보드)
- 표준 출력 장치: 실행 결과를 내보내는 장치(모니터)
- 표준 오류 장치: 오류 메시지를 내보내는 장치(모니터)
파일
- 파일 관리를 위해 붙이는 일련 번호
- 입출력 장치를 변경할 때는 이 파일 디스크립터를 사용
- 표준 입출력 장치를 파일로 바꾸는 것을 리다이렉션이라고 함
- 표준 입출력 장치의 파일 디스크립터
- 0: stdin, 명령의 표준 입력
- 1:, stdout, 명령의 표준 출력
- 2:, stderr, 명령의 표준 오류
방향 바꾸기
- 출력 재지정
- 입력 재지정
- >, >> (stdout을 파일로 저장 또는 추가)
- < (파일을 stdin으로 전달
파이프(|)
- Process 연결(stdout을 stdin으로 전달)
- Process 간의 데이터 흐름은 자동으로 조절
출력 리다이렉션
- > : 기존 파일의 내용을 삭제하고 새로 결과를 저장
- >> : 기존 파일의 내용 뒤에 결과를 추가
- 1 : 파일 디스크립터 1번(표준 출력, 화면)
- 셸은 >를 사용한 리다이렉션에서 지정한 이름의 파일이 없으면 파일을 생성해서 명령의 수행 결과를 저장
- 파일이 있으면 이전의 내용이 없어지고 명령의 수행 결과로 대체
오류 리다이렉션
- 표준 오류 메시지를 파일에 저장
- 파일 디스크립터 번호 생략 불가
- 명령 2> 파일명