FreeBSD에서, 일상적인 작업의 대부분이 쉘 (shell)이라고 하는 명령행 인터페이스(command line interface)에서 수행됩니다. 쉘의 본업무는 입력 채널에서 명령을 받아서 실행하는 것입니다. 대부분의 쉘은 파일 관리, 파일 글로빙 (file globing), 명령행 편집, 명령 마크로 및 환경변수와 같은 일상의 작업을 돕는 붙박이 (built in) 함수를 가지고 있습니다. FreeBSD에는 sh (Bourne 쉘) 및 csh (C-쉘)과 같은 쉘이 있습니다. 많은 tcsh과 bash같은 강력한 다른 쉘은 FreeBSD 포트 컬렉션으로 부터 얻을 수 있습니다.
어떤 쉘을 사용합니까? 기것은 실제 입맛의 문제입니다. C 프로그래머라면 tcsh같은 C-비슷한 쉘에 편안함을 느낄것입니다. 이전에 리눅스를 썼거나 처음으로 UNIX 명령행 인터페이스를 접한다면 bash를 시도해 보십시요. 요점은 개개의 쉘이 일상의 작업에 적할하거나 그렇지 않을 독특한 성질이 있어서, 어떤 쉘을 사용할지 고르는 것은 여러분이 할 일입니다.
쉘에서 공통적인 특징은 파일 이름 완성입니다. 명령이나 파일이름의 처음 몇글자를 타이핑한것에서 자판의 TAB글쇠를 누름으로 쉘이 명령이나 파일이름의 나머지가 자동으로 완성시킴니다. 예를 들어 보면, foobar와 foo.bar란 파일이있고, foo.bar를 지우려합니다. 이때 자판으로 다음과 입력합니다. rm fo[TAB].[TAB]
쉘은 rm foo[BEEP].bar라고 출력합니다.
[BEEP]는 콘솔 벨이고, 이것은 하나 이상이 매치되어서 파일이름을 완성시킬 수 말하는 것입니다. foobar과 foo.bar이 fo로 시작하므로, foo까지 완성시켰습니다. 이제 .을 입력하고 TAB을 다시 누르면, 쉘이 파일이름을 완성시켜줍니다.
쉘의 또다른 기능은 환경변수입니다. 환경변수는 쉘의 환경공간 (environmental space)에 저장되는 가변 키 쌍 (variable key pair) 입니다. 이 공간은 쉘에서 불러들인 임의의 프로그램이 읽을 수 있고, 수 많은 프로그램 설정을 포함하게 됩니다. 여기에서 흔히 쓰이는 환경변수와 의미를 나열하였습니다.
| 변수 | 설명 |
|---|---|
| USER | 현재 로긴한 사용자 이름. |
| PATH | 콜론으로 구분된 이진 파일 탐색 디렉토리 목록. |
| DISPLAY | 연결된 X11 디스플레이의 네트웍 이름. |
| SHELL | 현재 쉘. |
| TERM | 사용자 터미널 이름. 터미널의 허용치를 정하는 데 사용됨. |
| TERMCAP | 다양한 터미널 함수를 수행하는 터미널 이스케이프 코드 데이터베이스. |
| OSTYPE | 운영체제의 종류. 예, FreeBSD. |
| MACHTYPE | 동작하고 있는 시스템의 CPU 구조. |
| EDITOR | 사용자가 선호하는 텍스트 편집기. |
| PAGER | 사용자가 선하하는 텍스트 페이져(pager). |
| MANPATH | 콜론으로 구분된 메뉴얼 페이지 검색 디랙토리 목록. |
환경변수를 보거나 지정하는것은 쉘마다 조금씩 다릅니다. 예를들어, tcsh 및 csh같은 C-Style 쉘에서는, 환경변수를 지정하고 보는데 setenv를 사용한다. sh 및 bash같은 Bourne 쉘하에서는 현재 환경변수를 보거나 지정하는데 set 및 export를 사용합니다. 예를들어, 환경변수 EDITOR 를 정하거나 수정하려면, csh 혹는 tcsh하에서 EDITOR를 /usr/local/bin/emacs으로 지정하기 위해 다음 명령을 내립니다.
% setenv EDITOR /usr/local/bin/emacs
Bourne 쉘에서는:
% export EDITOR="/usr/local/bin/emacs"
대부분의 쉘은 명령행에서 환경변수 이름 앞에 $를 붙여서 이를 전개하도록 할 수 있습니다. 예를들어, echo $TERM는 $TERM가 정해진데로 출력합니다. 왜냐하면, 쉘이 $TERM를 전개해서 echo에게 전해주기 때문입니다.
쉘은 다수의 자료의 특수한 표현을 위해 메타-문자(meta-character)라고 부르는 특수 문자를 취급합니다. 가장 보편적인 문자는 * 이고, 이는 임의의 갯수의 파일이름을 표현합니다. 이들 특수 메타-문자는 파일 이름 글로빙(globing)에 사용됩니다. 예를들어, echo * 는 ls와 거의 같은 결과를 보여주는데 이는 쉘이 *와 맞는 모든 파일을 가져다 echo에게 넘겨주기 때문입니다.
쉘이 이들 특수 문자를 해석하는 것을 막으려면 백슬레쉬 (\) 문자를 앞에 붙입니다. echo $TERM 는 지정된 터미널이 무엇인지를 보여주지만, echo \$TERM 는 $TERM를 출력합니다.
쉘을 바꾸는 가장 쉬운방법은 chsh 명령을 사용하는 것입니다. chsh를 실행하면 환경변수 EDITOR에서 지정한 편집기를 부름니다. 만약 지정하지 않았다면 vi를 부름니다. 이때 "Shell:" 가 나타난 행을 바꿈니다.
chsh명령을 옵션 -s를 주므로서 편집기를 부르지 않게 할 수 있습니다. 예를들어, 쉘를 bash로 바꾼다면:
% chsh -s /usr/local/bin/bash
아무 파라메터 없이 chsh실행시키고 쉘를 편집해도 똑같이 동작합니다.
Note: 사용할 쉘은 틀림없이 /etc/shells에 있는 것이여야 합니다. 포트 콜렉션에서 쉘을 설치 했다면, 이것은 이미 행해 졌어야 합니다. 수동으로 설치했다면 이일을 해주어야 합니다.
예를 들어, bash를 수동으로 설치했고, /usr/local/bin에 위치한다면:
# echo "/usr/local/bin/bash" >> /etc/shells그런다음 chsh을 재시동하십시오.