공부 배경
서버 개발자에게 리눅스(Linux)란 뗄래야 뗄 수 없는 존재다.
대부분의 서버는 리눅스 운영체제를 사용하고 있기 때문이다.
백엔드 개발자들이 리눅스 환경에서 서버를 배포하는 이유는 아래와 같다.
- 웹서버(Web Server)인 Apache, Nginx 등이 리눅스 환경에서 최적화되어 돌아간다.
- 무료 오픈소스 운영체제이므로 별도의 금액이 들지 않는다. (Windows를 사용하면 큰 비용이 들어감.)
- 보안이 우수하다.1
- GUI가 아닌 CLI로 작업하기 때문에 작업 속도가 빠르다.(화면을 그리지 않아도 된다.)2
- CLI 기반이기 때문에 GUI보다 리소스를 효율적으로 사용할 수 있다.3
- 명령어를 조합해서 다양한 효율적인 작업이 가능하다.
- 오픈 소스 기반이기 때문에 자료가 방대하고 다양한 연구가 계속 진행 중이다.4
Reference : 리눅스란 무엇인가?
따라서 백엔드 개발자로서 Linux를 접할 기회가 많았는데, Linux만 나오면 너무 어렵고 막연했다.
그래서 이번 기회에 차근차근 Linux 운영체제에 대해서 공부해보려고 한다.
우선 날 계속 괴롭히는 Shell에 대해서 공부하고 싶었다.
추후 Linux 운영체제에 대한 자세한 정보와 핵심 명령어에 대해서 정리해놓겠다.
쉘(Shell) 이란?
‘쉘(Shell)’이란 사용자와 리눅스 커널 간에 인터페이스 역할을 하는 프로그램. 즉 명령어 처리기이다.
조금 쉽게 말해보자면 사용자가 입력하는 명령을 읽어 해석하고 프로그램을 실행시키는 인터페이스라고 할 수 있다.5
‘커널(kernel)’은 이와 같은 내용을 받아 하드웨어에 직접적으로 명령을 내려준다.
다시 차례대로 이야기해보자면,
- 쉘은 사용자로부터 입력받은 명령을 토큰으로 분류, 해석하여 존재하는 명령인지 명령의 형식은 맞는지를 확인한 후 커널에게 처리를 요청한다.
- 커널은 적절한 하드웨어 자원을 분배하여 명령을 처리한 후 결과를 돌려주고 사용자가 알아볼 수 있는 형태로 바꿔 출력한다.
즉, 쉘은 하드웨어에 직접 명령을 수행하는 ‘커널’과 ‘사용자’를 이어주는 중간다리와 같은 역할을 한다고 볼 수 있다.
윈도우(Windows) 운영체제 에서는 ‘명령 프롬포트(cmd)’로, 맥(MAC) OS X 운영체제 에서는 ‘터미널(Terminal)’로 쉘을 실행할 수 있다.
여기에 조금 더 정보를 추가하자면, 쉘과 터미널/콘솔은 사실 조금 다른 의미를 갖는다.
- 쉘 : 사용자가 글자를 입력하여 컴퓨터에 명령할 수 있도록 하는 프로그램
- 터미널/콘솔 : 쉘을 실행하기 위해 글자 입력을 받아 컴퓨터에 전달하거나 컴퓨터의 출력을 글자 화면에 쓰는 프로그램
하지만 쉘과 터미널/콘솔은 항상 같이 실행되므로 둘은 보통 같은 의미로 사용하고 있다고 이해하면 될 것이다.
쉘(Shell)의 기능
- 명령어 해석기 기능
- 사용자와 커널 사이에서 명령을 해석하여 전달.
- 프로그래밍 기능
- 일련의 명령어와 쉘 자체로 프로그램을 만들 수 있다.(Shell Script)
- 사용자 환경설정 기능
- 리눅스의 세션 변수들을 정의하여 사용자가 리눅스 환경을 설정할 수 있다.
쉘(Shell)의 종류
bourne shell 계열
- sh (bourne shell)
1974년 ‘Stephen Bourne’ (스티브 본) 이 개발한 최초의 쉘- 프롬프트 : $(일반유저) / #(root유저)
- 실행파일 :
/bin/sh
- 대부분의 리눅스에 기본적으로 설치
- 스크립트를 지원
- ksh (korn shell)
- 프롬프트 : $
- 실행파일 :
/bin/ksh
- 일반적으로 유닉스에서 가장 많이 사용되고 있는 shell
- 명령어 완성 기능, 히스토리 기능 지원
- bash (Bourne-Again Shell)
- 프롬프트 : #
- 실행파일 :
/bin/bash
- Linux 표준 쉘로 채택 (리눅스에서 가장 많이 사용하는 쉘)
- 최초로 개발된 쉘인 Bourne shell의 변형된 버전
- 명령어 완성 기능, 히스토리, 명령어 치환, 편집 등을 지원
- zsh (z shell)
확장형 본쉘, 콘쉘의 재작성 쉘- 프롬프트 : %
- 실행파일 :
/bin/zsh
- Korn Shell과 매우 유사한 셸이지만 Korn Shell보다 더 많고 유용한 기능 등을 추가하여 개선시킨 것
C Shell 계열
- csh (C 프로그램 스타일의 Shell)
- 프롬프트 : %
- 실행파일 :
/bin/csh
- C언어의 특징을 많이 포함함
- 히스토리, 별명, 작업 제어 등의 기능 포함
- 대화형 사용법에서는 Bourne shell과 대부분 호환되지만 전혀 다른 프로그래밍 인터페이스를 가지고 있고, 히스토리 대체라는 복잡한 기능으로 대신하고 있지만 명령행 편집 기능은 제공하지 않고 있다.
- tcsh (tc shell, tee-see-shell)
- 프롬프트 : >
- 실행파일 :
/bin/tcsh
- C Shell 수정본에 Korn Shell의 기능을 포함하여 개발된 셸
- 95%의 C Shell과 5%의 새로운 기능이 추가되어 만들어짐
내가 사용하고 있는 쉘이 무엇인지 알아보려면 아래와 같이 입력하면 확인할 수 있다.
1
echo $SHELL // 현재 사용 중인 셸의 위치를 출력한다.
쉘 스크립트(Shell Script) 란?
텍스트 형식으로 저장되는 프로그램으로서 한줄씩 순차적으로 읽어 실행되도록 작성된 프로그램. shell을 사용하여 컴퓨터에 시킬 명령을 텍스트로 작성하여 실행시킨다.
- 평문의 텍스트 파일로 하나의 명령어처럼 실행될 수 있는 실행 가능한 프로그램
- 쉘이 파일의 내용을 읽어 처리
- 선택/반복 등의 프로그래밍 구조를 사용할 수 있음
- 긴 작업, 반복적으로 일어나는 작업을 쉘 스크립트로 작성할 수 있음
- 쉘 스크립트를 새로운 명령어처럼 사용할 수 있음
기본 예시
예시로 다음과 같이 test.sh 파일을 작성한다.
1
2
3
#!/bin/sh
echo "Hello, World!"
- 쉘 스크립트 파일은 기본적으로 .sh 확장자로 작성한다.
- 실제 코드를 작성하기 전에 맨 처음의 행에는
#!/bin/sh
를 쓴다. 시스템에 지금부터 셸 스크립트를 쓴다는 사실을 알려주기 위함이다.
쉘 스크립트 파일(test.sh)를 실행하기 위해서는, 터미널에서 파일이 저장된 장소에 가서 아래의 커맨드 중 하나를 선택해서 실행해야한다.
1
2
3
4
# 스크립트 파일 실행 권한 추가
$ chmod 755 test.sh
# 파일명이 test.sh인 스크립트 실행
$ ./test.sh
명령어에 대한 부분은 리눅스 chmod 명령어 사용법 참고.
1
2
# 파일명이 test.sh인 스크립트 실행
$ sh test.sh
파일을 실행시키면, 작성한 Hello, World!가 표시된다.
쉘 스크립트 기본 문법에 대해서는 [Linux]리눅스 쉘 스크립트(Shell Script) 총정리 참고.
: Reference
랄라라:티스토리 - 쉘의 정의와 종류
Shell 이란? : Shell의 정의와 종류
[Linux] 쉘 스크립트(Shell script) 기초
우선 Windows, Mac OS는 사용자가 많기 때문에 상대적으로 해커들의 주된 표적이 되어왔다. 그리고 리눅스는 오픈소스 OS이기 때문에 해커들에게 쉬운 표적이 될 것 같지만 누구나 코드 검토 및 버그, 백도어들을 확인/수정할 수 있기 때문에 오히려 더 안전하다고 한다. ↩
CLI(Command Line Interface)와 GUI(Graphical User Interface)는 사용자 인터페이스의 두 가지 유형이다. CLI는 텍스트 기반 인터페이스이며, 키보드를 통해 명령어를 입력하여 컴퓨터와 상호작용한다. GUI는 그래픽 기반 인터페이스이며, 마우스를 통해 메뉴, 버튼, 아이콘 등의 그래픽 요소를 클릭하여 컴퓨터와 상호작용한다. ↩
예시를 들자면, AWS에서는 EC2 프리티어를 기준으로 램 1GB, 하드디스크 30GB를 주는데, 운영체제로 리눅스가 아닌 윈도우를 쓰면 리소스 부족으로 사실상 배포가 불가능하다. ↩
오픈소스의 가장 큰 장점이라고 볼 수 있다. 마이크로소프트나 맥의 경우 자사 운영체제를 공개하고 있지 않아 운영체제 상의 문제가 생기면 컴플레인을 걸거나 Q&A 외에는 해결 방도가 없다. 반면 리눅스의 경우 엄청난 커뮤니티가 있고 문제 상황에 맞는 방대한 질문과 응답 풀. 그리고 전문 지식들이 존재하고 그러한 정보마저 없으면 소스코드를 직접 분석할 수 있기 때문에 개발자한테는 정말 좋은 환경이라고 할 수 있다.(집단지성의 위대함..) ↩
‘쉘은 커널을 마치 껍질처럼 감싸고 있어, 사용자는 이 껍질을 통해야만 커널과 통신할 수 있다’하여 Shell이란 이름이 붙었다. ↩