리눅스 쉘, 환경변수

sesame·2021년 12월 22일
0

교육

목록 보기
5/46

리눅스 쉘에 대해 조사 및 정리

리눅스의 셸은 명령어와 프로그램을 실행할 때 사용하는 인터페이스로 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 한다.

인터페이스
다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미

셸의 기능

  • 사용자와 커널 사이에서 명령을 해석해 전달하는 명령어 해석 기능
  • 셸을 자체 내에 프로그래밍 기능이 있어서 프로그램을 작성할 수 있다.
  • 사용자 환경 설정 기능

셸의 종류와 특징

셸은 커널에서 분리된 별도의 프로그램

  • 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

로그인시 파일 읽는 순서

  1. /etc/profile
    로그인 과정에서 제일 먼저 실행되는 환경 파일
    root로 로그인하는 경우 일반 사용자들과는 달리 PATH 변수에 관리 명령이나 도구가 설치되어있는 /sbin, /usr/sbin, /usr/local/sbin 경로가 설정
  2. /etc/profile.d/*.sh
  3. ~/.bash_profile
  4. ~/.bashrc
  5. /etc/bashrc

Shell 프롬프트 설정

프롬프트는 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
EUIDsu 명령에서 사용하는 사용자의 유효 아이디값(UID와 EUID 값을 다를 수 있음)
DISPLAYwindow x 디스플레이 이름 정한다
IFS내부 공간 구분자의 줄임말, 제작된 명령어의 옵션과 명령어를 구별해주는 등의 역할을 하는 환경변수(default )
VISUALVISUAL 편집기 이름(화면 에디터: vi, emacs), VISUAL 먼저 시도후 실패하면(단만기가 화면에디터를 지원하지 않기 때문에) EDITOR 시도
EDITOR기본 에디터를 설정한다. export EDITOR=/usr/bin/vi 으로 설정
COLUMNS현재 터미널이나 윈도우 터미널의 컬럼의 수(=창의 너비, 터미널의 크기를 수동으로 움직이면 columns값도 변경된다)
LINES현재 터미널 라인의 수(=창의 길이, 터미널의 크기를 수동으로 움직이면 lines값도 변경된다)
LS_COLORSls 명령의 색상 관련 옵션
PS11차(기본) 명령 프롬프트 변수(기본값: bash**$**)호스트 및 사용자명, 현재 작업 디렉터리 및 시간 같은 것을 나타냄
PS22차(보조) 명령 프롬프트 (기본값: >), 명령어가 완전히 입력되지 않았을 때 >가 뜬다.(더 입력하라는 표시), 명령 끝에 \를 작성하면 다음 줄에 이어간다는 의미로 받아들임
PS3쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #?), 셸 스크립트 내의 select loop에 대한 사용자 지정 프롬프트를 정의할 수 있다.
( ex) 1)mon
2)tue
3)wed
#? 1
Monday
PS4쉘 스크립트 디버깅 모드의 프롬프트 변수, 스크립트에 -x 옵션이 걸려서 실행될 때 스크립트의 매 줄마다 "+"로 표시됨
TMOUT0이면 제한이 없으면 time 시간 지정시 지정한 시간 이후 로그아웃(윈도우의 절전모드 같은 식으로 동작이 없으면 그 뒤로 초를 계산), 단위는 초단위(0이면 무한대), bash에서 사용
BASHbash 실행 파일 경로
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: 중복 로그를 삭제하고 최근로그만 남김)
HISTIGNOREex)HISTIGNORE="pwd:ls:ls -l:"
pwd, ls, ls -l명령은 로그에 기록하지 않는다.
HOSTNAME호스트 명(현재 사용중인 컴퓨터 이름)
HOSTTYPE시스템 하드웨어 종류
MACHTYPE머신 종류(HOSTTYPE과 같은 정보지만 조금 더 상세하게 표시됨)
USERNAME현재 사용자 이름
LOGNAME로그인 명
LS_COLORSls 명령어 확장자 색상 옵션
MAIL메일 보관 경로, 새 메일이 왔는지 알아 보기 위해 이 변수를 사용
MAILCHECK메일 확인 시간
OSTYPE운영체제 타입(종류)
MANPATHman 명령어 메뉴얼이 있는 곳의 경로
TZtime zone을 설정, 우리나라는 ROK(Republic of Korea
LD_LIBRARY_PATH컴파일러에게 라이브러리의 위치 알려줌, 컴파일시 라이브러리의 위치를 명시하지 않고 컴파일하면, 컴파일러는 이 환경변수로 설정한 경로에서 해당 라이브러리를 찾고, 만약 찾는 라이브러리가 없으면 컴파일 에러(default /usr/lib /usr/local/lib)
PAGER출력을 화면에 나타낼 때 페이지 단위로 잘라주는 paginator을 설정(more, less, pg), 이 PAGER 변수는 man을 보여줄 때 영향을 줌, man을 디스플레이 할 때 한페이지가 넘어가면 다른키를 누를 때까지 그대로 대기하는데 이때 여기서 설정한 paginator의 명령어를 사용
MOTD_SHOWNmotd(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 환경변수명

0개의 댓글