본문 바로가기

Linux

[리눅스 마스터 2급] 1과목 리눅스 운영 및 관리, 셸(Shell)

Chapter 02 셸(Shell)

Section 01 개념 및 종류

1. 개념

셸 (Shell)

명령어 해석기(command interpreter), 사용자가 입력한 명령어를 해석하여 커널에 전달

커널과 사용자 간의 대화식 IF 제공, 강력한 스크립트 언어, 포어그라운드/백그라운드 프로세스 실행

 

2. 종류

본셸C셸 계열로 나뉨

 

본셸

종류 실행 파일 특징
본셸 계열 본셸
(Bourne Shell)
/bin/sh - 가장 먼저 개발, 벨 연구소의 스티븐 본이 1979년 개발,
- 유닉스에서 기본 셸로 사용, alias 존재x,
- 조건구문(if)와 반복구문(while)을 이용, 1977년 유닉수 버전 7에 포함
콘셸
(korn shell)
/bin/ksh - AT&T사의 데이비드 이 1986년에 개발, 벨 연구소에서 본셸 확장해서 만듦
- 명령어 완성 기능, 히스토리 기능 가짐
배쉬 셸
(bash shell)
/bin/bash - 리눅스의 표준셸
- 브라이언 폭스가 1989년 개발, 본셸을 기반으로 GNU 프로젝트에 의해 개발, 리눅스 표준 셸로 채택, 명령어 완성&치환 기능 완성, POSIX와 호환
-GNU 운영체제와 리눅스, 맥OS, 다윈 등 여러 OS의 기본 셸로 탑재, 광범위하게 배포됨
- DJGPP 와 노벨 넷웨어에 의해 도스로 이식, 시그원과 MinGW의 배포로 마이크로소프트 윈도로 이식
- 명령, 히스토리, 명령어 완성 기능, 히스토리 치환, 명령행 편집 등을 지원, 본 셸을 기반으로 하여 제작
지셸
(z shell)
/bin/zsh - 폴 팔스타드가 1990년에 개발, 확장형 본셸으로 Korn shell의 재작성 셸

 

C셸

종류 실행파일 특징
C셸 계열 C셸 /bin/csh 버클리 대학의 빌 조이가 개발
C 언어 스타일의 문법을 지원해서 C 프로그래머들이 사용하기 편리하도록 설계
BSD 계열 시스템에서 여전히 볼 수 있고, 과거 유닉스 시스템 이해에도 도움 되는 개념
tc셸 /bin/tcsh 카네기 멜런 대학의 켄 그리어(Ken Greer)가 테넥스(TENEX) 운영체제에 명령행 완성 기능을 반영하면서 시작
- 확장 C셸로 BSD 계열에서 많이 사용, 명령어 편집 기능을 제공

 

2. 셸 확인 및 변경

셸은 사용자가 로그인 후 자동으로 생성되는 로그인 셸과 사용자가 직접 변경 실행하는 서브 셸(sub shell)로 구분

로그인 셸 변경은 반영구적인 셸 변경 방법으로 관리자가 셸 변경 후 다음 변경을 하기 전까지 지정된 셸을 사용

 

1) 로그인 셸 확인

파일 /etc/shells(= chsh -l) 에서 사용할 수 있는 셸들 확인 가능 (/etc/shell, /etc.login, /etc/logins 다 아님!)

사용자가 로그인 직후에 부여 받은 셸을 확인하는 방법

$cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tch

/bin/csh

 

파일 /etc/passwd 파일에서 계정마다 할당된 셸 확인 가능

echo $SHELL 현재 로그인한 사용자가 사용하고 있는 셸 확인 가능

 

명령어 chsh(change shell)

현재 사용 중인 로그인 셸을 변경하는 명령어, 일반 사용자 환경에서 셸 변경 시 사용

chsh [옵션] 계정명 셸

-l : /etc/shells 파일 안에 지정된 셸을 나열
-s는 기본 셸로 변경함 잊지 말자, -s랑 chsh 고르는 문제 나옴

 

명령어 usermod

관리자 환경에서 지정된 계정의 정보를 변경할 때 사용하는 명령어

usermod [옵션] 계정명 셸

 

명령어 Set

Bash의 쉘 변수를 관리하는 명령어, 셸 변수 확인 명령어, 셸 변수는 셸에만 적용되는 변수, 변수명=값 or export 변수명=값

ex. $var1=linux

$export var2 = linux2

$set | grep var1

출력내용 var1=linux

$set | grep var2

출력내용 var2 = linux2


Section 02 환경 설정

1. 환경 변수와 셸 변수

명령어 env

현재 설정된 전체 환경 변수 확인 명령, 환경 변수(전역 변수) : 전체 셸에서 사용 가능, 서브 셸에 기능 상속 가능

 

명령어 set   

셸 변수 확인 명령, 셸 변수(지역 변수) : 현재 로그인 셸에서만 사용 가능, 서브 셸에 상속 불가능, 

 

주요 환경 변수

PATH : 실행할 명령어 경로 검색, 셸 설정 파일 중 하나에 설정, 여러 개의 PATH 넣을 때, 구분은 콜론(:)으로 함

PATH 추가 명령어 형식 : export PATH=$PATH:추가경로

ex. PATH=$PATH:$HOME/bin  , 기존 경로에 /home/ihd 경로를 추가할 경우 : export PATH = $PATH:/home/ihd 

HOME : 사용자의 홈 디렉터리 절대 경로

HOSTNAME : 호스트명

USER : 사용자 이름

DISPLAY : X 디스플레이 이름, X 서버의 주소를 지정

PS1 : 셸 프롬프트를 선언 시 사용하는 변수, 프롬프트 변수

ex. PS1="[\u@\t\W]\$"

 

PS2 : 2차 셸 프롬프트를 선언 시 사용하는 변수, 명령줄이 바뀌면서 나타나는 기호와 관련된 환경변수

명령줄이 긴 경우 \(역슬래시) 이용하면 명령행 연장 가능, 명령어 줄이 바뀌면서 나타나는 기호 ">"를 "PS2 프롬프트" 라고 함

PWD : 현재 디렉터리의 절대 경로명

SHELL : 로그인 셸의 절대 경로명

TERM : 터미널 종류의 이름 ex. TERM=xterm

TMOUT : 로그아웃 관련 시간 제어

LANG : 프로그램 사용 시 기본 지원 언어, ex. LANG=C

PRINT : 기본 프린터

MAIL : 도착한 메일이 저장되는 경로

PROMPT : 화면에 출력되는 프롬프트 모양 지정 변수

환경 변수 설정

ex. SA=shina

1) 명령어 export

환경 변수 리스트 확인

ex. export=SA

2) export 변수명=변수값 

3) 명령어 echo : 표준 출력(화면에 텍스트를 출력)하는 명령어

echo $변수명

echo $SA

4)명령어export : 환경 변수를 설정하거나 확인하는 명령어

export 변수명=$변수명:변수값

기존 변수명에 변수 값 추가

ex. export SA=$SA:shina

5) unset 변수명

변수 정의 해제

ex. unset SA

 

프롬프트 설정 형식

셸의 프롬프트 형식을 사용자 임의대로 변경할 수 있음

명령어

\t : 24시로 현재 시간을 표시

\W : 현재 작업 디렉터리의 전체 경로 중 마지막 디렉터리만 표시

\w : 현재 작업 디렉터리를 절대 경로로 표시

\s :  사용중인 셸 이름 표시

\u : 현재 사용자의 이름을 표시

\h : 호스트 이름을 표시

 

ex. ihd 사용자가 셸 프롬프트를 변경하려고 할 때 알맞은 것?

[ihd@09:30:21 ~\]$

PS1="[\u@\t\W]\$"

 


Section 02 환경 설정

2. 환경 설정 파일

셸 시작 시 자동으로 실행되는 고유의 시작 파일이 있으며, 이 파일은 사용자 운영환경을 설정

 

맨 앞에 /etc가 들어가면 전역 설정 파일

/etc/bashrc

별칭(alias)과 bash가 수행 시 실행되는 함수를 전역적으로 제어, 전역 설정 파일

생략되기도 하며, /etc/profile에 내용이 포함되기도 함

 

$HOME/.bashrc

배쉬셸의 환경파일, 개인 사용자가 정의한 alias와 함수들이 있는 파일

개인 사용자의 환경 변수 설정도 가능

 

/etc/group

4개 기본 항목 구성, 그룹명, 그룹 패스워드, 그룹 ID, 그룹 구성원 정보

 

배쉬셸(bash shell) 주요 기능

History 기능

일정 개수(기본 1000개) 이상 사용했던 명령어를 .bash_history에 저장해 두고 다시 불러서 사용할 수 있게 하는 기능

상하 화살표 키만 누르면 다시 사용할 수 있음

 

History 관련 환경 변수

history n : 최근에 사용했던 n개의 명령어만 출력

history 10

HISTIMEFORMAT : 히스토리 명령어 수행 시간 출력 형태 지정, 명령어 히스토리 기능에 시간을 설정할 수 있는 기능, 사용자가 수행한 명령어를 추적할 때 사용


!1 : 1번 명령어 실행

!! : 가장 마지막에 실행한 명령 호출

!? : !?문자열? 가장 최근에 사용한 명령 중에 문자열을 포함하고 있는 명령어를 찾아서 실행

history 1 : 가장 최근에 사용한 1개의 명령어를 확인

 


기타

$cd /disk1;tar cvf - .|(cd /disk2; tar xvf -)

두 개의 디렉터리(/disk1과 /disk2)에서 tar 명령어를 사용하여 데이터를 압축하고 복원하는 작업을 동시에 수행하는 예제

 

tar 명령어

파일을 압축하거나 압축 해제하는 데 사용

 

tar cvf - .

tar 명령어는 파일을 압축하거나 압축 해제하는 데 사용돼.

c → 새로운 아카이브 파일 만들기 (create)

v → 과정 출력 (verbose), 압축되는 파일들을 출력

f → 파일 지정 (file), 압축 결과를 지정할 파일로 출력

- → 아카이브를 표준 출력(stdout)으로 보냄 (즉, 파일로 저장하지 않고 터미널로 출력)

. → 현재 디렉터리의 모든 파일을 아카이브에 포함

=> /disk1 디렉터리에서 모든 파일과 폴더를 아카이브로 만들고, 그 내용을 표준 출력으로 보냄.

| (파이프)

앞의 명령어의 출력을 뒤의 명령어로 넘겨주는 역할

/disk1의 tar 명령어로 생성된 아카이브 데이터를 /disk2 디렉터리로 전달

(cd /disk2; tar xvf -)

()는 서브셸을 의미해. 즉, 괄호 안의 명령어는 별도로 실행되는 독립적인 셸에서 실행돼.

cd /disk2 → /disk2 디렉터리로 이동

 

tar xvf -

아카이브를 압축 해제하는 명령어

x → 압축 해제 (extract)

v → 과정 출력 (verbose)

f → 파일 지정 (file), 압축 해제할 아카이브 파일을 지정

- → 표준 입력(stdin)을 통해 아카이브 데이터를 받음 (즉, tar가 /disk1에서 생성한 아카이브를 직접 받음)

 

🔹 종합 해석

/disk1에서 모든 파일을 아카이브로 만든 후 그 데이터를 표준 출력으로 보내.

그 데이터를 파이프를 통해 /disk2 디렉터리로 전달하여, 해당 위치에서 압축 해제하는 구조.

/disk1의 모든 파일을 tar로 압축하여 pipe로 넘기고, 이를 disk2로 받아서 압축을 풀어 동일한 파일 구조를 생성하는 작업을 한다는 의미야.

 

사용자의 로그인 셸을 확인하는 명령어

SHELL 변수의 내용을 확인

finger 명령어의 -l  옵션을 사용

 

finger 명령어

시스템에 로그인한 사용자에 대한 상세 정보를 조회, 사용자 이름, 로그인 상태, 로그인 시간, 홈 디렉터리, 로그인 셸 등의 정보를 확인

 

ls 명령어
현재 디렉터리에서 파일 목록을 출력하는 명령어

 

ls file[12].py

파일 이름 패턴을 사용한 ls 명령어로, 현재 디렉터리에서 특정 형식의 파일을 조회하는 명령

정규 표현식 []은 ['과'] 사이의 문자 중 하나를 선택

대괄호 []는 문자 집합을 의미하며, 여기서는 1 또는 2가 올 수 있다는 의미로 사용

 

 

 

 

미리 작성된 파일 내용을 메일 계정자에게 보낼 경우의 형식

mail 메일계정 < 파일명

즉, mail webmaster@example.com > report.txt

 

배쉬셸 명령행 편집 기능

Ctrl + E : 맨 오른쪽 이동

Ctrl + A : 맨 왼쪽 이동

Ctrl + B : 커서를 왼쪽으로 한 칸 이동

Ctrl + F : 커서를 오른쪽으로 한 칸 이동