■ 리눅스의 부팅과 종료, 리부팅
리눅스 시스템을 부팅하면 가장 먼저 init이라는 첫 번째 프로세스가 시작되고, 

init 프로세스와 연결된 수많은 프로세스들이 자신만의 프로세스 아이디 (PID)를 가지고 생성되기 시작합니다. 

init 프로세스는 첫 번째 프로세스이기 때문에 PID는 1입니다.
여기서 PID는 프로세스를 구분하기 위한 식별자인데, init 프로세스가 시스템을 초기화하고 터미널 라인을 오픈하기 위한 작업을 시작, 

표준 입력 (stdin), 표준 출력 (stdout), 표준 에러 (stderr)를 설정합니다.

리눅스에서의 init 프로세스는 /etc/rc.d/init.d 디렉토리에 런레벨별로 설정되어 있는 쉘 스크립트를 실행하는데, 

이 쉘 스크립트들은 chkconfig 명령을 사용하여 부팅 시 자동으로 실행할 것인지, 실행하지 않을 것인지 설정할 수 있습니다.
그리고 부팅 시 수행할 런레벨은 /etc/inittab 파일에 설정되어 있습니다.

로그인 프롬프트에서 /bin/login 프로그램이 /etc/passwd 파일에 있는 첫 번째 필드를 체크하기 위해 유저 아이디를 먼저 검증하고, 

만약 유저 아이디가 존재한다면 패스워드를 검증합니다. 

패스워드가 맞다면 login 프로그램은 /etc/passwd 파일에 정의되어 있는 HOME, SHELL, USER, LOGNAME 등의 다양한 변수들로 초기화를 진행합니다. 

HOME 변수에서 홈디렉토리를, SHELL 변수에서 로그인 쉘을, USER와 USERNAME 변수에는 로그인 이름을 할당합니다.

로그인이 끝나면 /etc/passwd 파일에서 유저 라인의 마지막 단계에 입력되어 있는 프로그램을 실행합니다.
일반적으로 이 프로그램은 배시 쉘 (/bin/bash)로 설정되어 있기 때문에 배시 쉘이 시작됩니다.
만약 다른 쉘을 사용하고자 한다면 원하는 쉘로 변경해두면 다음 접속부터는 지정한 쉘을 사용할 수 있습니다.

- 쉘 초기화 파일

파일 이름
설명
/etc/profile 이 파일에는 PATH, USER, LOGNAME, MAIL, HOSTNAME, HISTSIZE, INPUTRC 등의 쉘 변수들이 선언되어 있는데, 이와 같은 시스템 전역 쉘 변수들을 초기화합니다.
/etc/bashrc  쉘 함수와 alias들을 위한 시스템 전역 정의들을 포함하고 있습니다.
~/.bash_profile 유저 개인의 환경 설정 파일로써, 시스템 전역이 아닌 유저 자신만의 PATH와 시작 프로그램을 추가적으로 설정할 수 있는 파일입니다.
~/.bashrc 유저 자신의 개인적인 명령어 alias를 정의할 수 있으며, /etc/bashrc 파일에서 시스템 전역 변수를 읽은 다음, 특별한 프로그램을 위한 변수를 설정할 수 있다.
~/.bash_logout  이 파일은 각 유저의 자신에 대한 로그아웃 절차를 포함하고 있습니다. 예를 들어, 로그아웃을 하면 터미널 윈도우가 사라집니다.
source 앞의 모든 환경 설정 파일들을 수정한 다음, 리부팅 또는 재접속 없이 수정된 새로운 환경 설정 내용을 즉시 적용하기 위해서 source 명령을 사용합니다.


■ 명령라인 파싱
쉘 프롬프트에 명령을 타이핑했을 때 쉘은 입력 라인을 읽고 명령라인을 파싱합니다.

- 명령라인 프로세싱 순서

① 히스토리 치환이 수행됩니다.
② 명령라인은 토큰 또는 단어 단위입니다.
③ 히스토리가 업데이트 됩니다.
④ 인용이 진행됩니다.
⑤ 앨리아스 치환가 함수가 정의됩니다.
⑥ 리다이렉션, 백그라운드, 파이프가 설정됩니다.
⑦ 변수 치환 ($usr, $name, etc.)이 수행됩니다.
⑧ 명령 치환 (echo "Today is 'data'")이 수행됩니다.
⑨ globbing (cat abc.??, rm *.c, etc.)이라는 파일명 치환이 수행됩니다.
⑩ 명령이 실행됩니다.

■ 명령어 타입
앨리아스, 함수, 빌트인 명령 또는 디스크 (저장장치)에 있는 실행 프로그램 등의 명령들이 쉘에서 실행됩니다.
앨리아스는 C, TC, bash 쉘에서 실행할 수 있는 명령들을 위한 닉네임 단축형입니다.

함수는 본 쉘, 배시 쉘에서 사용되며 앨리아스와 함수는 쉘의 메모리에 정의되어 있습니다.
빌트인 명령어는 쉘에서 내부 루틴이고 디스크 저장장치에는 실행 파일이 존재합니다.
쉘은 명령이 실행되기 전 자식 프로세스를 찾고 실행 프로그램의 위치를 찾기 위해 PATH 변수를 사용합니다.


- 명령어 타입 순서
 앨리아스
 키워드
 함수
 빌트인 내장명령
 실행파일

■ 프로세스와 쉘
- 프로세스란
프로세스란, 유일한 PID 번호에 의해 식별될 수 있는 실행 프로그램입니다.
커널은 프로세스를 제어하고 관리하는데, 프로세스는 실행 프로그램의 데이터와 스택, 

프로그램 포인터와 스택 포인터 그리고 프로그램을 실행하기 위해 필요한 모든 정보들로 구성되어 있습니다.

쉘은 로그인 프로세스를 완료했을 때 시작하는 특별한 프로그램입니다.
즉, 쉘은 프로세스인 것인데, 쉘은 PID 그룹에 의해 식별되는 그룹 프로세스에 소속됩니다.

오직 하나의 프로세스 그룹은 하나의 터미널은 제어합니다.
이 말은 포그라운드에서 실행될 수 있다는 뜻입니다.
로그인을 했을 때 쉘은 터미널의 관리를 받고 있으며 프롬프트에서 명령을 타이핑 받기 위해 기다립니다.

- 시스템 콜이란
쉘은 다른 프로세스를 생성할 수 있습니다. 
프롬프트 또는 쉘 스크립트로 부터 명령을 실행했을 때 쉘은 빌트인 내부 코드에서 혹은 디스크 저장장치에서 명령을 찾고 실행된 명령을 정렬합니다.
이와 같은 작업은 커널에 의해 이루어지는데, 이것을 시스템 콜이라고 합니다.

시스템 콜은 커널 서버스를 요청하고 시스템의 하드웨어에 접근할 수 있는 유일한 프로세스이며, 

다수의 시스템 콜들은 프로세스들을 생성하고 실행, 종료할 수 있습니다.

 

■ 쉘 프롬프트
쉘 프롬프트가 보이면 명령을 입력할 수 있습니다.

배시 쉘은 4가지의 프롬프트를 제공하는데, 첫 번째 $와 두번째 >, 그리고 PS3, PS4가 있습니다.
PS1 변수는 첫 번째 프롬프트를 포함하는 문자열로 설정되며, 달러 ($) 기호는 유저가 로그인했을 때 보여집니다.
PS2 변수는 두 번째 프롬프트인데, 디폴트로 > 문자로 설정됩니다. 이 두 프롬프트는 변경이 가능합니다.

■ Bash 쉘  관련
- 검색 경로
배시 쉘은 명령라인에 타이핑된 명령의 위치를 찾기 위해 PATH 변수를 사용합니다.
이 변수의 값은 디렉토리 목록을 콜론 (:)으로 분리하여 정의합니다.
디폴트 경로는 시스템에 의존적이며 bash를 설치한 관리자에 의해 설정되고 좌에서 우로 검색하게 됩니다.
여기서 dot (.)은 현재 작업 디렉토리를 의미하는데, 만약 명링이 PATH 변수에 지정된 디렉토리 목록에 없다면 쉘은 표준 에러 메세지를 보냅니다.

- hash 명령
hash 명령은 명령을 더욱 효과적으로 검색하기 위해 내부 해시 테이블을 관리합니다.
PATH 변수로부터 명령을 매번 검색하는 대신 처음으로 명령을 타이핑하면 쉘은 명령을 찾기 위해 검색 경로를 검색하고 쉘 메모리의 테이블에 저장해 둡니다.

다음 번에 같은 명령을 사용하면 쉘은 메모리에 저장해둔 hash 테이블을 사용하여 명령을 보다 빨리 찾게 됩니다.

- source 또는 dot (.) 명령
source 명령은 빌트인 내장 bash 명령이며, dot (.) 명령은 source 명령과 동일합니다.
이 두 명령은 아규먼트로 스크립트 이름을 사용하며, 현재 쉘의 환경 내에서 실행되며, 자식 프로세스는 시작되지 않습니다.
스크립트 내에 설정된 모든 변수들은 현재 쉘 환경의 부분이 됩니다.

source (.) 명령은 일반적으로 초기화 파일 (.bash_profile, .profile 파일이 변경되었을 때)을 재실행할 때 사용합니다.
그래서 각종 환경 설정파일들을 변경한 다음 변경한 내용을 즉시 적용하기 위해 source (.) 명령을 사용합니다.

■ 명령라인
리눅스 시스템에 로그인하면 배시 쉘은 프라이머리 프롬프트를 출력하고 유저인 경우 달러 ($) 기호를 보여줍니다.
쉘은 명령어 인터프리터이며 터미널로부터 명령을 읽고 워드 단위로 명령라인을 잘라서 읽어들입니다.
명령라인은 하나 이상의 워드로 구성되며, 공백이나 탭으로 분리되고, newline으로 종료되며, 엔터 키를 누르면 명령라인에 타이핑된 명령을 실행합니다.


- 명령어 처리 순서
명령라인에서의 첫 번째 단어는 명령어로 실행됩니다. 
이때 명령어는 키워드, 앨리아스, 함수, 특수 빌트인 명령 또는 유틸리티, 실행 가능한 프로그램, 쉘 스크립트가 될 수 있습니다.
다음과 같은 명령어 타입들이 실행됩니다.
- 앨리아스
- 키워드 (if, function, while, until 등)
- 함수
- 빌트인 내장명령
- 실행 가능한 프로그램과 쉘 스크립트

특수 빌트인 내장명령과 함수는 쉘에서 정의되며 현재의 쉘 내에서 빠르게 실행됩니다.
디스크에 저장되어 있는 스트립트와 ls, data 같은 실행 가능한 프로그램은 PATH 환경 변수에 정의된 데렉토리 구조 내에서 위치를 찾아냅니다
이후 스크립트를 실행할 새로운 쉘을 fork 합니다. 즉, 자식 프로세스를 생성하는 것 입니다.

■ 잡 컨트롤
잡 컨트롤은 선택적으로 프로그램을 실행시킬 수 있는 것으로써 jobs라고 부르며, 백그라운드와 포그라운드가 있습니다.
실행 중인 프로그램을 프로세스 또는 잡 (job)이라고 부르고, 각 프로세스는 PID라는 고유의 프로세스 아이디를 가지고 있습니다.

일반적으로 명령라인에 타이핑되는 명령은 포그라운드로 실행되고, <Ctrl-C> 또는 <Ctrl-\> 를 눌러 종료 시그널을 보내기 이전까지 계속 실행됩니다.
잡 컨트롤에서 job을 백그라운드로 보내고 실행 상황을 유지할 수 있도록 할 수 있습니다. 
job을 중지하기 위해서는  <Ctrl-Z> 키를 누르면 됩니다.

 

-  잡 컨트롤 관련 명령과 아규먼트

job 명령 의미
bg 백그라운드에서 중지된 잡을 실행하도록 합니다.
fg 백그라운드 잡을 포그라운드로 가져옵니다.
jobs 실행되고 있는 모든 잡 목록을 보여줍니다.
kill 지정된 잡에게 kill 시그널을 보냅니다.
stop 백그라운드 잡을 멈춥니다.
stty tostop 백그라운드 잡이 터미널로 출력을 보내면 멈춥니다.
wait [n] 지정된 잡을 멈추고 종료 상태값을 리턴합니다. n은 PID 또는 잡 번호입니다.
^Z (Ctrl-Z) 잡을 멈춥니다. 프롬프트가 모니터에 나타납니다.

 

아규먼트 의미
%n n은 잡 번호
%string 문자열로 시작되는 잡 이름
%?string 문자열을 포함하는 잡 이름
%% 현재 잡
%+ 현재 잡
%- 현재 잡의 이전 잡
-r 실행되고 있는 모든 잡의 목록
-s 멈춰진 모든 잡의 목록

 

■ alias
alias는 명령어를 위한 단축형 사용자정의입니다. 

실행할 명령의 옵션과 아규먼트가 많고 기억하기 어려울 만큼 명령이 같다면 alias를 사용하는 것이 좋습니다.
명령라인에서 설정한 alias는 서브 쉘로 상속되지 않습니다.

 

 일반적으로 새로운 쉘이 시작되면 alias들은 리셋되기 때문에 .bashrc 파일에 설정하는데, 

이 파일에 설정하는 이유는 새로운 쉘이 시작될 때 항상 .bashrc 파일을 실행하기 때문입니다.
alias 빌트인 내장명령을 사용하면 앨리아스로 설정된 모든 명령들을 출력합니다. 

alias 명령 다음이 앨리아스 이름이며, 실제 명령은 = 기호 다음에 작음따옴표로 둘러싸인 부분입니다.


첫 번째 아규먼트는 앨리아스 이름이며 명령의 닉네임입니다.
그리고 = 기호 다음에 적은 문자열은 앨리아스로 지정된 이름을 실행하면 실행될 명령입니다.
배시 쉘에서의 앨리아스는 아규먼트를 가지지 않으며, 

다중 명령은 세미콜론으로 분리하고, 공백과 메타문자를 포함하는 명령들은 작음따옴표로 묶어주어야 합니다.
unalias 명령은 앨리아스를 삭제할 때 사용합니다.

■ 쉘 확장 순서
브레이스({ }) 확장
② 틸드(~) 확장
③ 파라미터 확장
④ 변수 치환
⑤ 명령 치환
⑥ 산술 확장
⑦ 단어 자르기
⑧ 경로명 확장

■ 배열
배시 쉘은 1차원 배열 생성을 지원합니다. 배열은 하나의 변수 이름에 숫자 목록, 이름 목록, 파일 목록 등의 단어 목록 집합을 할당할 수 있습니다.
배열은 빌트인 함수 declare -a로 x[0] 형태로 생성합니다. 인덱스 값은 정수값 0부터 시작하고, 배열에서 최대 크기 제한은 없습니다.
배열 요소를 가져올 때에는 ${배열명[idx]} 형식을 사용하며, declare 명령과 -a와 -r 옵션을 사용하면 읽기전용 배열이 생성됩니다.

■ 함수
bash 함수는 현재 쉘의 컨텍스트 안에 명령들의 그룹 이름을 사용합니다. (자식 프로세스가 생성되지 않습니다.)
함수는 스크립트처럼 효율적입니다. 일단 함수가 한번 정의되면 쉘 메모리에 적재되기 때문에 함수가 호출될 때 디스크로부터 읽어들일 필요가 없습니다.
종종 함수는 스크립트 모듈을 향상시키기 위해 사용됩니다. 한번 정의되면 함수는 계속해서 사용할 수 있습니다.
함수는 실행될 때 프롬프트에서 정의될 수 있지만 대부분 유저의 초기화 파일에 정의합니다. 또한 함수는 호출되기 이전에 반드시 정의되어 있어야 합니다.

-형식
함수명() { commands ; commands; }
function 함수명 { commands; commands; }
function 함수명() { commands; commands; }

'Shell' 카테고리의 다른 글

vi 단축키 및 marking 사용법  (0) 2020.12.21
Shell 특수문자 정리  (1) 2020.04.02
리눅스 쉘과 명령어 기초  (0) 2020.03.23