리눅스의 셸은 명령어와 프로그램을 실행할 때 사용하는 인터페이스로 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 한다.
인터페이스
다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미
셸은 커널에서 분리된 별도의 프로그램
Bourne Shell - sh
유닉스 초기부터 사용된 Shell로 대부분의 유닉스 계열 운영체제에서 지원
많은 쉘스크립트가 sh를 기반으로 한다.
Bourne Again Shell - bash : 현재 리눅스의 표준 셸
1989년 브라이언폭스가 GNU 프로젝트를 위해 개발한 bash Shell은 sh Shell을 기반으로 만들었다.
bash셸은 Korn Shell(ksh)과 C Shell(csh)의 기능들을 통합시켜 개발
bash는 리눅스뿐만 아니라 GNU 운영체제, 맥 OS X 등 다양한 운영체제에서 사용 중
C Shell - csh
1978년 버클리 대학 빌조이가 개발, C언어 기반
C Shell은 강력한 프로그램 작성 기능을 가짐
크기가 커지고 속도가 느려졌다는 단점이 있지만 편리한 기능 때문에 일반 사용자들이 즐겨 사용
Korn Shell - ksh
1983년 AT&T사의 벨 연구소에서 근무하던 데이비드 콘이 개발
이 콘 셸 역시 오리지널인 sh을 확장해서 만들고 C Shell의 많은 기능들을 추가
C Shell의 특징들을 모두 제공하면서 처리속도도 빠르다는 장점
-TC SHELl - tcsh
C Shell에 명령행 완성과 명령행 편집 기능을 추가
로그인 쉘: 로그인할 때 수행되는 기본 쉘
logout 명령을 로그아웃하여 쉘 종료 가능
텍스트 모드에서 사용자 계정으로 로그인할 때 수행되는 쉘
.profile, .bash_profile 이 두 파일은 Login할 때 로드되는 파일이다.
.profile'은 꼭 bash가 아니더라도 로그인하면 로드되며, '.bash_profile'은 꼭 bash로 로그인 할 때만 실행된다.
비 로그인 쉘: 말 그대로 로그인 쉘이 아닌 쉘
logout 명령이 아닌 exit 명령으로 쉘을 종료
GUI 환경에서 터미널을 띄우면 수행되는 쉘
만약 새 터미널 창을 열 때마다 .bashrc를 로드하고 싶다면 .bash_profile 에서 .bashrc를 로드하면 된다.
서브 쉘: 현재 쉘 안에서 실행되는 쉘
현재 쉘의 자식 프로세스로 실행, exit 명령으로 서브 쉘을 종료하고 부모 쉘로 돌아간다. 서브 쉘은 부모 쉘의 환경변수를 전달받아 공통적으로 사용할 수 있다.
현재 설치된 Shell 확인
$ cat /etc/shells //또는 $ chsh -l
현재 지정된 Shell 확인
$ ehco $SHELL //또는 $ grep 사용자ID /etc/passwd
설정 Shell 종류 변경(ksh로 변경)
$ usermod -s /bin/ksh //또는 $ chsh -s /bin/ksh //chsh 명령어는 셸을 변경하는 명령어로 chsh를 입력하면 password를 입력하고 변경하려는 셸의 종류를 입력하면 변경된다. //필요한 Shell이 설치되어있지 않다면, 해당 리눅스 계열에 맞는 명령어로 yum, rpm 등으로 설치 //변경 가능한 셸의 종류 확인 $ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
로그인시 파일 읽는 순서
- /etc/profile
로그인 과정에서 제일 먼저 실행되는 환경 파일
root로 로그인하는 경우 일반 사용자들과는 달리 PATH 변수에 관리 명령이나 도구가 설치되어있는 /sbin, /usr/sbin, /usr/local/sbin 경로가 설정- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
프롬프트는 command 상에서 입력줄에 표시되는 기본 정보 부분을 가리킨다
설정은 사용자 별로 ~./bashrc에서 $PS1, $PS2() 변수에 지정하여 사용하는 것이 일반적
모든 계정에 대한 설정은 /etc/bashrc 또는 /etc/profile.d/prompt.sh 파일을 수정하여 설정
프롬프트에 사용하는 옵션
\t: 24시간의 단위로 현재시각을 HH:MM:SS 로 표시
\T: 12시간의 단위로 현재시각을 HH:MM:SS 로 표시
\@: 12시간의 단위로 현재시각을 오전/오후 로 표시
\d: 현재 날짜를 나타냄. 요일, 월, 일 형식으로
\s: 현재 사용중인 쉘의 이름을 나타냄 (C쉘이면 /bin/csh, bash쉘이면 /bin/bash)
\w: 현재 디렉토리의 전체 절대경로를 모두 표시함
\W: 현재 디렉토리의 전체 절대경로명 중 마지막 디렉토리명만을 표시함. 즉 현재디렉토리만 표시함
\u: 사용자명을 표시함
\h: 서버의 호스트명을 표시함 (www.uzuro.com에서 www 부분)
\H: 서버의 도메인명을 표시함 (www.uzuro.com에서 uzuro.com 부분)
#: 접속한 순간부터 사용한 명령어의 번호를 1번부터 차례대로 표시함
!: 사용한 명령어의 history 번호를 표시함
\$: 현재 사용자가 root(uid 가 0 )이면 # 을 표시하고 아니면 $ 를 표시함
\: '\' 문자 자체를 표시함
\a: ASCII 종소리 문자 (07)
\e: ASCII 의 escape 문자 (033)
\n: 개행문자 (줄바꿈)
\v: 사용중인 bash 의 버전
\V: 사용중인 bash 의 배포, 버전+패치수준으로 버전을 상세히 표시함
\r: Carrage retrun
\nnn: 8진수 nnn 에 해당하는 문자$ export PS1="\u@\h@\W > " $ export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\h@\[\e[33;1m\]\W >\[\e[0m\]"
쉘의 환경변수는 로그인 할 때 설정된다. 모든 계정에 공통적으로 적용되는 글로벌 프로파일과 로그인 계정에서 사용하는 환경 설정인 계정 프로파일이 있다.
이 프로파일의 파일 위치와 이름은 운영체제와 쉘에 따라 조금씩 다르다.
sh, ksh: /etc/profile과 사용자 홈 디렉터리의 .profile
리눅스 bash: /etc/profile과 /etc/bashrc랑 사용자 홈 디렉터리의 .bashrc
csh: /etc/csh.login랑 사용자 홈 디렉터리의 .cshrc
앞에거는(/etc/profile) 모든 계정에 공통적으로 적용
.~는(.profile) 해당하는 로그인 계정에서만 사용하는 환경설정이 된다.
그렇기 때문에 .bashrc은 각 계정의 홈 디렉터리 아래에 존재
-- root로 로그인을 하면 먼저 /etc/profile과 /etc/bashrc를 읽어들여서 적용 후 root의 홈 디렉터리에 있는 .bashrc를 읽어들이는 것
환경 변수 확인 방법
$ env //전체 출력
$ echo $환경변수이름 //하나씩 확인 가능
$ env | grep 환경변수명 //하나씩 확인 가능
환경변수 | 내용 |
---|---|
HOME | 현재 사용자 홈 디렉터리, /etc/paswd에 등록되어있음, 쉘 스크립트 작성시 많이 사용하는 변수, Cshell에도 home이 있는데, 이것은 HOME 변수를 카피해가는 것 |
PATH | 실행파일을 찾기 위한 디렉토리의 경로, PATH를 명시하지 않으면 default로 /usr/bin 또는 /bin 디렉터리가 설정됨 |
LANG | 프로그램 사용시 기본 지원 언어 |
PWD | 사용자가 현재 작업중인 디렉터리 |
FUNCNAME | 현재 함수 이름 |
SECONDS | 스크립트가 실행된 초 단위 시간 |
TERM | 로그인 터미널 타입 xterm: 컴퓨팅에서 x 윈도 시스템을 위한 표준 단만 에뮬레이터 x window system? GUI 프레임워크이며, 이미지 처리가 가능한 개발환경 vt100, vt200, ANSI standard terminal |
SHLVL | 쉘 레벨(중첩된 깊이를 나타냄) |
SHELL | 로그인해서 사용하고 있는 쉘, 시스템 관리자에게 바꾸도록 요청 또는 자신의 현재 프롬프트 상에서 원하는 쉘을 실행하는 명령어 또는 startup 등에 원하는 쉘 등록 후 사용 가능 |
PPID | 부모 프로세스의 PID |
USER | 현재 사용자 이름 |
USERNAME | 사용자 이름 |
GROUPS | 사용자 그룹(/etc/passwd 값을 출력) |
UID | 사용자 UID |
EUID | su 명령에서 사용하는 사용자의 유효 아이디값(UID와 EUID 값을 다를 수 있음) |
DISPLAY | window x 디스플레이 이름 정한다 |
IFS | 내부 공간 구분자의 줄임말, 제작된 명령어의 옵션과 명령어를 구별해주는 등의 역할을 하는 환경변수(default ) |
VISUAL | VISUAL 편집기 이름(화면 에디터: vi, emacs), VISUAL 먼저 시도후 실패하면(단만기가 화면에디터를 지원하지 않기 때문에) EDITOR 시도 |
EDITOR | 기본 에디터를 설정한다. export EDITOR=/usr/bin/vi 으로 설정 |
COLUMNS | 현재 터미널이나 윈도우 터미널의 컬럼의 수(=창의 너비, 터미널의 크기를 수동으로 움직이면 columns값도 변경된다) |
LINES | 현재 터미널 라인의 수(=창의 길이, 터미널의 크기를 수동으로 움직이면 lines값도 변경된다) |
LS_COLORS | ls 명령의 색상 관련 옵션 |
PS1 | 1차(기본) 명령 프롬프트 변수(기본값: bash**$**)호스트 및 사용자명, 현재 작업 디렉터리 및 시간 같은 것을 나타냄 |
PS2 | 2차(보조) 명령 프롬프트 (기본값: >), 명령어가 완전히 입력되지 않았을 때 >가 뜬다.(더 입력하라는 표시), 명령 끝에 \를 작성하면 다음 줄에 이어간다는 의미로 받아들임 |
PS3 | 쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #?), 셸 스크립트 내의 select loop에 대한 사용자 지정 프롬프트를 정의할 수 있다. ( ex) 1)mon 2)tue 3)wed #? 1 Monday |
PS4 | 쉘 스크립트 디버깅 모드의 프롬프트 변수, 스크립트에 -x 옵션이 걸려서 실행될 때 스크립트의 매 줄마다 "+"로 표시됨 |
TMOUT | 0이면 제한이 없으면 time 시간 지정시 지정한 시간 이후 로그아웃(윈도우의 절전모드 같은 식으로 동작이 없으면 그 뒤로 초를 계산), 단위는 초단위(0이면 무한대), bash에서 사용 |
BASH | bash 실행 파일 경로 |
BASH_ENV | 스크립트 실행시 bash 시작 파일을 읽을 위치 변수 |
BASH_VERSION | 설치된 bash 버전 |
BASH_VERSINFO | 원소 갯수가 6개인 배열로 현재 설치된 Bash 버전에 대한 정보를 담고 있다. BASH_VERSION과 비슷하지만 좀더 자세한 정보를 담고 있다. $ BASH_VERSINFO[0] = 2 //Major version no. $ BASH_VERSINFO[1] = 04 //Minor version no. $ BASH_VERSINFO[2] = 21 //Patch level. $ BASH_VERSINFO[3] = 1 //Build version. $ BASH_VERSINFO[4] = release //Release status. $ BASH_VERSINFO[5] = i386-redhat-linux-gnu //Architecture($MACHTYPE 과 동일). |
HISTFILE | 히스토리 파일 경로, 사용된 명령어들이 저장될 파일의 이름(history 명령어와는 달리 꺼지기 전의 명령어가 입력되어있음), histfilesize의 개수만큼 저장되고 이전에 있던 명령어들을 사라짐 |
HISTSIZE | 히스토리 파일 크기, 파일에만 영향을 미치는 것이 아닌 history 명령어 출력시의 명령어 수도 제한(default 500) |
HISTCONTROL | 중복되는 명령에 대한 기록 유무 지정(ignorespace:명령 실행시 처음 스페이스가 포함되면 로그에 기록x, ignoredups: 명령 중복되면 무시, erasedups: 중복 로그를 삭제하고 최근로그만 남김) |
HISTIGNORE | ex)HISTIGNORE="pwd:ls:ls -l:" pwd, ls, ls -l명령은 로그에 기록하지 않는다. |
HOSTNAME | 호스트 명(현재 사용중인 컴퓨터 이름) |
HOSTTYPE | 시스템 하드웨어 종류 |
MACHTYPE | 머신 종류(HOSTTYPE과 같은 정보지만 조금 더 상세하게 표시됨) |
USERNAME | 현재 사용자 이름 |
LOGNAME | 로그인 명 |
LS_COLORS | ls 명령어 확장자 색상 옵션 |
메일 보관 경로, 새 메일이 왔는지 알아 보기 위해 이 변수를 사용 | |
MAILCHECK | 메일 확인 시간 |
OSTYPE | 운영체제 타입(종류) |
MANPATH | man 명령어 메뉴얼이 있는 곳의 경로 |
TZ | time zone을 설정, 우리나라는 ROK(Republic of Korea |
LD_LIBRARY_PATH | 컴파일러에게 라이브러리의 위치 알려줌, 컴파일시 라이브러리의 위치를 명시하지 않고 컴파일하면, 컴파일러는 이 환경변수로 설정한 경로에서 해당 라이브러리를 찾고, 만약 찾는 라이브러리가 없으면 컴파일 에러(default /usr/lib /usr/local/lib) |
PAGER | 출력을 화면에 나타낼 때 페이지 단위로 잘라주는 paginator을 설정(more, less, pg), 이 PAGER 변수는 man을 보여줄 때 영향을 줌, man을 디스플레이 할 때 한페이지가 넘어가면 다른키를 누를 때까지 그대로 대기하는데 이때 여기서 설정한 paginator의 명령어를 사용 |
MOTD_SHOWN | motd(message of today) 파일 설정 환경 변수(pam: 로그인 성공 후 임의의 motd 파일을 표시할 수있는 모듈, update_motd:) |
XDG_DATA_DIRS | 사용자별 데이터 파일을 작성해야 하는 상대적인 단일 기본 디렉토리 정의 |
$ export 환경변수 = 값
이와 같은 단순한 환경변수 지정은 현재 열어놓은 그 터미널에서만 변수로 동작하고 다른 터미널 콘솔에서는 변수로 지정되지 않는다.
변수가 계속 유지되도록 전역 설정을 하려면 어떻게 해야하는가?
/etc/bash.bashrc 파일 수정 --모든 계정에 적용하고 싶을 때
.bashrc 파일 수정 -- 사용자의 계정에서만 적용하고 싶을 때
// 먼저 만일을 대비해서 bashrc의 백업을 만든다. (물론 부팅시를 기준으로 한 백업 파일인 '$HOME/.bashrc~'가 존재 한다.)
$ cp ~/.bashrc ~/.bashrc.bak
// .bashrc 파일에 추가할 환경변수를 삽입
$ echo 'export she="my love"' >> ~/.bashrc
//재부팅 할 필요 없이 '~/.bashrc' 파일의 소스를 로드
$ source ~/.bashrc
//지정된 환경변수를 불러옴
$ echo $she
my love
//'she'에 대한 환경변수가 출력 되는데 성공
$ unset 환경변수명