Home 쉘(Shell)
Post
Cancel

쉘(Shell)

공부 배경


서버 개발자에게 리눅스(Linux)란 뗄래야 뗄 수 없는 존재다.
대부분의 서버는 리눅스 운영체제를 사용하고 있기 때문이다.

백엔드 개발자들이 리눅스 환경에서 서버를 배포하는 이유는 아래와 같다.

  • 웹서버(Web Server)인 Apache, Nginx 등이 리눅스 환경에서 최적화되어 돌아간다.
  • 무료 오픈소스 운영체제이므로 별도의 금액이 들지 않는다. (Windows를 사용하면 큰 비용이 들어감.)
  • 보안이 우수하다.1
  • GUI가 아닌 CLI로 작업하기 때문에 작업 속도가 빠르다.(화면을 그리지 않아도 된다.)2
  • CLI 기반이기 때문에 GUI보다 리소스를 효율적으로 사용할 수 있다.3
  • 명령어를 조합해서 다양한 효율적인 작업이 가능하다.
  • 오픈 소스 기반이기 때문에 자료가 방대하고 다양한 연구가 계속 진행 중이다.4

Reference : 리눅스란 무엇인가?

따라서 백엔드 개발자로서 Linux를 접할 기회가 많았는데, Linux만 나오면 너무 어렵고 막연했다.
그래서 이번 기회에 차근차근 Linux 운영체제에 대해서 공부해보려고 한다.

우선 날 계속 괴롭히는 Shell에 대해서 공부하고 싶었다.
추후 Linux 운영체제에 대한 자세한 정보와 핵심 명령어에 대해서 정리해놓겠다.

쉘(Shell) 이란?


‘쉘(Shell)’이란 사용자와 리눅스 커널 간에 인터페이스 역할을 하는 프로그램. 즉 명령어 처리기이다.
조금 쉽게 말해보자면 사용자가 입력하는 명령을 읽어 해석하고 프로그램을 실행시키는 인터페이스라고 할 수 있다.5

‘커널(kernel)’은 이와 같은 내용을 받아 하드웨어에 직접적으로 명령을 내려준다.

다시 차례대로 이야기해보자면,

  1. 쉘은 사용자로부터 입력받은 명령을 토큰으로 분류, 해석하여 존재하는 명령인지 명령의 형식은 맞는지를 확인한 후 커널에게 처리를 요청한다.
  2. 커널은 적절한 하드웨어 자원을 분배하여 명령을 처리한 후 결과를 돌려주고 사용자가 알아볼 수 있는 형태로 바꿔 출력한다.

즉, 쉘은 하드웨어에 직접 명령을 수행하는 ‘커널’과 ‘사용자’를 이어주는 중간다리와 같은 역할을 한다고 볼 수 있다.

윈도우(Windows) 운영체제 에서는 ‘명령 프롬포트(cmd)’로, 맥(MAC) OS X 운영체제 에서는 ‘터미널(Terminal)’로 쉘을 실행할 수 있다.

여기에 조금 더 정보를 추가하자면, 쉘과 터미널/콘솔은 사실 조금 다른 의미를 갖는다.

  • 쉘 : 사용자가 글자를 입력하여 컴퓨터에 명령할 수 있도록 하는 프로그램
  • 터미널/콘솔 : 쉘을 실행하기 위해 글자 입력을 받아 컴퓨터에 전달하거나 컴퓨터의 출력을 글자 화면에 쓰는 프로그램

하지만 쉘과 터미널/콘솔은 항상 같이 실행되므로 둘은 보통 같은 의미로 사용하고 있다고 이해하면 될 것이다.

Shell설명

쉘(Shell)의 기능


  1. 명령어 해석기 기능
    • 사용자와 커널 사이에서 명령을 해석하여 전달.
  2. 프로그래밍 기능
    • 일련의 명령어와 쉘 자체로 프로그램을 만들 수 있다.(Shell Script)
  3. 사용자 환경설정 기능
    • 리눅스의 세션 변수들을 정의하여 사용자가 리눅스 환경을 설정할 수 있다.

쉘(Shell)의 종류


bourne shell 계열

  1. sh (bourne shell)
    1974년 ‘Stephen Bourne’ (스티브 본) 이 개발한 최초의 쉘
    • 프롬프트 : $(일반유저) / #(root유저)
    • 실행파일 : /bin/sh
    • 대부분의 리눅스에 기본적으로 설치
    • 스크립트를 지원
  2. ksh (korn shell)
    • 프롬프트 : $
    • 실행파일 : /bin/ksh
    • 일반적으로 유닉스에서 가장 많이 사용되고 있는 shell
    • 명령어 완성 기능, 히스토리 기능 지원
  3. bash (Bourne-Again Shell)
    • 프롬프트 : #
    • 실행파일 : /bin/bash
    • Linux 표준 쉘로 채택 (리눅스에서 가장 많이 사용하는 쉘)
    • 최초로 개발된 쉘인 Bourne shell의 변형된 버전
    • 명령어 완성 기능, 히스토리, 명령어 치환, 편집 등을 지원
  4. zsh (z shell)
    확장형 본쉘, 콘쉘의 재작성 쉘
    • 프롬프트 : %
    • 실행파일 : /bin/zsh
    • Korn Shell과 매우 유사한 셸이지만 Korn Shell보다 더 많고 유용한 기능 등을 추가하여 개선시킨 것

C Shell 계열

  1. csh (C 프로그램 스타일의 Shell)
    • 프롬프트 : %
    • 실행파일 : /bin/csh
    • C언어의 특징을 많이 포함함
    • 히스토리, 별명, 작업 제어 등의 기능 포함
    • 대화형 사용법에서는 Bourne shell과 대부분 호환되지만 전혀 다른 프로그래밍 인터페이스를 가지고 있고, 히스토리 대체라는 복잡한 기능으로 대신하고 있지만 명령행 편집 기능은 제공하지 않고 있다.
  2. 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) 기초

  1. 우선 Windows, Mac OS는 사용자가 많기 때문에 상대적으로 해커들의 주된 표적이 되어왔다. 그리고 리눅스는 오픈소스 OS이기 때문에 해커들에게 쉬운 표적이 될 것 같지만 누구나 코드 검토 및 버그, 백도어들을 확인/수정할 수 있기 때문에 오히려 더 안전하다고 한다. 

  2. CLI(Command Line Interface)와 GUI(Graphical User Interface)는 사용자 인터페이스의 두 가지 유형이다. CLI는 텍스트 기반 인터페이스이며, 키보드를 통해 명령어를 입력하여 컴퓨터와 상호작용한다. GUI는 그래픽 기반 인터페이스이며, 마우스를 통해 메뉴, 버튼, 아이콘 등의 그래픽 요소를 클릭하여 컴퓨터와 상호작용한다. 

  3. 예시를 들자면, AWS에서는 EC2 프리티어를 기준으로 램 1GB, 하드디스크 30GB를 주는데, 운영체제로 리눅스가 아닌 윈도우를 쓰면 리소스 부족으로 사실상 배포가 불가능하다. 

  4. 오픈소스의 가장 큰 장점이라고 볼 수 있다. 마이크로소프트나 맥의 경우 자사 운영체제를 공개하고 있지 않아 운영체제 상의 문제가 생기면 컴플레인을 걸거나 Q&A 외에는 해결 방도가 없다. 반면 리눅스의 경우 엄청난 커뮤니티가 있고 문제 상황에 맞는 방대한 질문과 응답 풀. 그리고 전문 지식들이 존재하고 그러한 정보마저 없으면 소스코드를 직접 분석할 수 있기 때문에 개발자한테는 정말 좋은 환경이라고 할 수 있다.(집단지성의 위대함..) 

  5. ‘쉘은 커널을 마치 껍질처럼 감싸고 있어, 사용자는 이 껍질을 통해야만 커널과 통신할 수 있다’하여 Shell이란 이름이 붙었다. 

This post is written by 서병범.

마크다운 사용법

IntelliJ 유용한 단축키 정리