[UNIX 시스템] 3강 - 셸 사용하기

2026. 10. 13. 01:44·방송통신대학교/🐧 UNIX 시스템

📌 개요

🔑 학습 키워드

┗  셸 종류: Bash(Bourne Again Shell), Bourne 셸, C 셸, TC 셸, Korn 셸

┗  기본 셸 선택하기: etc/passwd 마지막 항목에 기본 셸 프로그램 경로가 적힘

┗  셸 시작: 로그인 시 실행(default=bash), 셸 종료: exit

┗  셸 명령 형식: command options arguments => 짧은 옵션(-), 긴 옵션(--)

┗  셸 명령 실행: PATH 환경변수 => ls(입력) -> /bin/ls(ls 파일 찾아서 실행)

┗  셸 명령 종류 크게보면: alias, 셸 예약어, 함수, 내장 명령, 일반 명령(외부 명령)

┗  셸 명령 종류: alias, type, which, whereis, man (대표적 기본 명령)

┗  셸 명령 히스토리: history, !, !!, 방향키

┗  셸 명령 연결 및 확장: 백슬래시(\), 인용부호(',"), 리다이렉션(>,<,>>,<<), 명령치환(₩₩)

┗  셸 명령 그 외: date, who, cal

┗  셸 변수: 수식, 변수(지역변수, 환경변수)

 

💡 1. 셸(Shell)

[ 셸(shell) ]

┗  명령어를 해석하고 관리하는 프로그램

┗  과거에는 키보드를 이용하여 명령어를 타이핑하는 방법만 가능했음

┗  셸은 커널과 사용자 간의 가교 역할

┗  리눅스 셸은 강력한 기능 제공함

┗  셸은 "명령어 해석기"이면서 "스크립트 언어"이기도 함

 

[ 셸 종류 ]

┗  Bourne 셸:

- 벨(Bell) 연구소의 스티븐 본(Stephen Boume)이 개발함
- 많은 셸 스크립트가 Boume 셸에 기반하고 있음

┗  C 셸:

- 스크립트 형식이 C 언어 구문과 유사함
- BSD 계열의 유닉스 사용자가 많이 사용했음

┗  TC 셸:

- C 셸을 확장 개선한 버전
- '명령 행 완성'과 '명령 행 편집' 기능을 추가함
- /bin/tcsh

┗  Korn 셸:

- Bourme 셸을 확장하고 C 셸의 많은 기능을 추가함
- System V 계열 유닉스 사용자에게 인기가 많았음

┗  Bourne Again 셸:

- Boume 셸을 토대로 개발함
- C 셸과 Korn 셸의 유용한 기능을 가져와 통합함
- '많은 리눅스 배포판'에서 '기본 셸'로 사용됨
- /bin/bash

 

[ 기본 셸 선택하기 ]

┗  /etc/passwd 파일에서 "사용자 계정 정보"의 "마지막 항목"에 "기본 셸"이 기록됨

[ 'etc/passwd 내부' ] => 참고로 passwd 는 파일임
root:x:0:0:root:/root:/bin/bash             <-- 1번 사용자(관리자): bash 사용
junbin:x:1000:1000:Hong:/home/hong:/bin/sh <-- 2번 사용자(hong): sh 사용

┗  Bash 셸의 실행 프로그램: /bin/bash

┗  Bourne 셸의 실행 프로그램: /bin/sh

┗  chsh -s /bin/sh 명령어를 수행하면 기본 셸을 Bourne 셸로 변경 가능

 

[ 셸을 시작 명령 & 종료 명령 ]

┗  셸 시작: 로그인하거나 터미널 창을 띄우면 시작

┗  또한, 셸 프롬프트에서 특정 셸 프로그램을 실행시킬 수도 있음

- 예를들면, '/bin/tcsh'을 실행하면 'TC 셸'이 시작이 됨
- 즉, '/bin/bash'를 실행하면 'bash 셸'이 시작되는 원리임
-> 이것은 원래 셸에서 '서브셸'을 시작시키는 것임
-> 로그인할 때부터 실행되는 기본 셸 위에서 실행하는 것이므로 서브셸을 시작시키는것과 같음

┗  서브셸을 종료하려면 "exit" 명령을 수행해야 하며, 이때 원래 셸로 돌아감

 

💡 2. 셸 명령 형식

[ 셸 명령 형식 ]

┗  형식: > command options arguments

┗  "명령어(command)"에 따라 "옵션"이나 "인수"가 (필수적, 선택적)일 수 있음

┗  옵션: 어떤 옵션을 사용하느냐에 따라 명령의 의미나 출력 형태가 달라짐

┗  인수: 명령의 수행 대상을 의미함

 

[ 옵션 ]

┗  짧은 옵션:

- 1개의 문자를 대시(-) 문자 뒤에 붙여 '-a'와 같이 사용함
- '유닉스 스타일' 옵션이라고 함
- 여러 옵션 사용 시 개별적으로 나열도 가능함
- 예사: 'ls -lat' 또는 'ls -l -a -t'

┗  긴 옵션:

- 이중대시(--) 뒤에 단어를 붙여 사용함 (--help)
- 'GNU 스타일' 옵션이라고 함
- 예시: ls --help 또는 ls --all --sort=time

┗  옵션을 지정할 때 대시(-)를 사용하지 않는 "BSD 스타일" 옵션도 있음 ( ex: ps a )

 

[ 인수 ]

┗  인수: 명령어의 수행 대상을 의미함

┗  파일 이름, 디렉터리, 사용자 계정, 디바이스 등이 "인수"로 사용됨

- 'cat /etc/passwd'
- '명령어': cat, '인수': /etc/passwd

┗  옵션에도 인수가 필요할 수 있음:

- '짧은 옵션': 공백 다음에 인수를 위치시킴
-> '예시': chsh -s /bin/tcsh => 옵션 -s 의 인수 /bin/tcsh
-> 즉, grep -e "hello" text.txt => [명령어][옵션 + 인수][인수]

- '긴 옵션': 공백 없이 바로 등호(=)와 인수를 붙여 지정함
-> '예시': ls -l --sort=time => 옵션 --sort 의 인수 time

 

[ 셸 명령의 실행과 PATH 환경변수 ]

┗  셸 명령을 수행하기 위해서는 실행 프로그램이 필요

┗  실행 프로그램은 셸의 환경변수 중 PATH 변수에 설정되어 있는 경로 중에 있어야 함

┗  PATH 변수의 값을 확인하기 위해 echo $PATH를 실행할 수 있음

-'예시': ls 입력 -> PATH 환경변수 열기 -> 적힌 폴더 주소를 통해 ls 이름의 파일 찾기
-> ls => /bin/ls

 

💡 3. 셸 명령 종류

[ 셸 명령 종류 ]

┗  에일리어스: 명령 또는 [명령 옵션]을 짧은 별칭으로 정의

┗  셸 예약어: 셸 스크립트 작성 시 사용되는 do, while, case, else 등

┗  함수: 셸에서 수행될 수 있는 일련의 명령을 함수로 정의한 것

┗  내장 명령: 셸 내부에 만들어져 있는 명령

- cd, echo, pwd 등 이며, man builtin & help builtin-command 로 사용법 확인 가능

┗  일반 명령(또는 외부 명령): 파일 시스템에 실행 파일로 존재하는 명령

- 실행 파일이 PATH 환경변수에 포함된 경로에 있어야 -> 명령어 이름만 입력하여 실행 가능
- 실행 파일 구별을 위해 확장자는 따로 존재하지 않음

 

[ alias 명령 ]

┗  명령의 별칭을 만드는 기능 => 자주 사용되는 명령 빠르고 효율적인 단축 명령으로 만듦

- alias 명령 사용 -> 특정 명령을 옵션과 함께 짧은 '별칭'으로 정의해 둔 것
- '예시': alias ll='ls -l' => ll 별칭으로 ls -l 명령어 사용 가능
- 'alias 설정 해제': unalias [명령어]
- '참고': alias 설정 유지를 위해선 셸 환경 설정 파일에 기록해야함 ( ~./bashrc )

 

[ type 명령 ]

┗  특정 명령을 어떻게 해석하는지 알기 위해 사용하는 명령

┗  해당 명령에 대한 정보를 알려준다고 보면 됨

- 'alias 의 경우': type ll => ll is aliased to 'ls -l'
-> type ll 의 정보로 어떤 명령어가 alias로 된 기존 명령인지 보여줌
- '내부 명령의 경우': type [명령어] => is a shell builtin
-> 결과는 shell 의 builtin 임을 나타냄
- '일반 명령(외부)의 경우': type ls => ls is /bin/ls
- PATH 환경변수 속 폴더에 파일 형태로 존재하는 진짜 프로그램(일반 명령)의 경우 경로가 나옴

 

[ which 명령 ]

┗  셸 명령을 인수로 지정하고 이것의 실제 실행 프로그램을 알아내기 위한 명령

┗  즉, 외부 실행 파일에 한해서 사용하는 명령어로 특정 명령어의 파일 경로 주소(PATH)를 찾아줌

- which ls => /bin/ls (외부 실행 파일 위치)

 

[ whereis 명령 ]

┗  which 와 동일하게 경로를 찾아주지만, 소스와 메뉴얼 페이지가 존재할 때 이것도 같이 찾아줌

- whereis ls => ls: /bin/ls /usr/share/man/man1/ls.1.gz(메뉴얼)

 

[ man 명령 ]

┗  명령어의 메뉴얼 페이지(설명서)를 볼 수 있는 명령어 ( 각종 프로그램 사용법 확인 가능 )

- '자주 사용되는 형식': man [section] command
-> 같은 명령어인데 다른 뜻을 내포할 수 있기 때문에 섹션을 통해 구별 가능
- 'man 1 passwd': 일반 사용자가 계정 비밀번호 변경에 쓰는 명령어 프로그램(bin/passwd)
- 'man 5 passwd': 실행 프로그램이 아니라 텍스트 설정 파일의 규칙(포맷)(/etc/passwd 텍스트 문서)

['섹션의 분류']
- '1': 사용자 명령
- '2': 커널 시스템 호출(커널이 제공하는 함수)
- '3': C 라이브러리 함수
- '4': 디바이스 드라이버 정보
- '5': 시스템 설정 파일의 형식
- '6': 게임
- '7': 파일 포맷, 인코딩 등
- '8': 시스템 관리 명령

┗  앞선 5가지 명령어의 공통점: 가장 기본적인 명령어 5가지임

- 앞선 5가지 명령어(alias, type, which, whereis, man)
-> '공통점': 리눅스 시스템 명령어의 정체 파악, 위치 찾기, 사용법을 알아내는 도구

 

💡 4. 셸 명령 히스토리

[ 명령 히스토리 & 명령 행 불러오기 ]

┗  이전에 수행하였던 명령의 목록을 의미

- 'histroy': 이전 사용한 명령어 목록을 보여줌. (default: 보통 1000개)
- '!!': !! 만 치면 바로 직전에 사용한 명령어를 바로 실행
- '!':
$ history
  1  mkdir test_dir
  2  cd test_dir
  3  ls -la

$ !1
-> history 목록의 번호를 통해 실행 가능
-> '![알파벳,단어]' 형식으로 최근에 쳤던 명령중 관련있는거 바로 실행
- 또한, '방향키(위,아래)'를 통해 직전 또는 직후 명령 불러올 수 있음

 

[ 명령 행 완성 기능 ]

┗  셸 명령 입력 시 처음 몇 자만 타이핑 후 탭(Tap) 키 자동 완성

- '명령어, alias, 함수': 보통 문자로 시작하는 경우
- '변수': 달러($) 기호로 시작하는 경우
- '디렉터리': 틸드(~) 문자로 시작하는 경우
- '호스트 이름': at(@) 기호로 시작하는 경우

 

💡 5. 셸 명령의 연결과 확장

[ 특수 문자 ]

┗  백슬래시( \ ): 특수 문자 앞에 붙어 특수 문자의 기능을 제거하는 기능

- 즉, 특수 문자의 기능을 제거해 그냥 문자처럼 사용을 하게 도와줌
- 명령 행을 연잘할 때도 사용함

┗  인용부호(',"): 공백 포함 문자열을 인수로 사용하고싶을 때 쓰는 기능

- 리눅스 셸(Shell)에서 공백은 명령어 옵션, 인수를 구분하는 구분자 역할을 함
-> 그렇기 때문에 '인용부호('',")'를 활용해서 문자열로 취급함
- '작은따옴표': 내부의 모든 것을 오직 문자 그대로(Literal) 취급
- '큰 따옴표': 작은 따옴표와 유사하나, 일부 특수 문자($, `, \)의 기능은 허용

┗  세미콜론(;): 여러 명령을 순서대로 실행할 때 구분하기 위해 사용함
┗  앰퍼샌드(&): "명령&"는 명령을 백그라운드로 실행시킴

┗  물음표(?): 파일 이름에서 사용할 때 1개 문자와 대응

┗  도트(.): 현재 작업 디렉터리

┗  더블 도트(..): 현재 디렉터리의 부모 디렉터리

 

[ 파이프 ]

┗  파이프( | ): 앞 명령의 출력을 다음 명령의 입력으로 연결시키는 기능

- '예시': cat file.txt | grep "error"
-> cat = 출력 명령어, grep = 특정 단어 포함된 줄 반환
-> '결과': file.txt 의 내용을 grep 가 받아 error 단어가 포함된 줄 반환

 

[ 리다이렉션 ]

┗  왼쪽 화살괄호(<)는 표준입력(키보드)을 지정된 파일로 디라이렉션하는 기능

- echo "안녕하세요" > hello.txt
-> "안녕하세요" 결과를 화면이 아닌, hello.txt 입력
- sort < /etc/passwd
-> passwd 파일의 내용을 sort(정렬) 후 화면에 출력

- '왼쪽(<)': 키보드로 받아야 할 입력을 파일에서 가져오도록 출발지를 바꾸는 것
- '오른쪽(>)': 모니터로 나와야 할 출력을 파일로 보내도록 목적지를 바꾸는 것
- '>>,<<': 덮어씌우는게 아닌 덧붙히는것!!

- 리눅스 출력 번호 3가지
-> '0' : 표준 입력 (키보드)
-> '1' : 표준 출력 (정상적인 결과 메시지, 생략 가능)
-> '2' : 표준 오류 (에러 메시지)
command > file: 표준출력을 지정된 파일로 보냄
command 2> file: 표준오류 출력을 지정된 파일로 보냄
command > file 2>&1: 표준출력, 표준오류 출력을 지정된 파일로 보냄

┗  참고로 >,< 화살표는 덮어씌기 기능임

┗  만약 파일이 이미 존재한다면, 기존 내용을 다 지우고 새로운 내용으로 덮어씌우게 됨

 

[ 명령 치환 ]

┗  $(command) 또는 `command` 형태

┗  명령어를 수행하기 전에 위와 같은 명령을 셸이 먼저 처리함

ls -l $(which passwd) = ls -l /usr/bin/passwd
-> 오른쪽 = 왼쪽은 내용이 같으며, $() 먼저 명령어 수행 후 결과를 다음 명령에서 사용

 

[ date 명령 ]

┗  서버의 날짜와 시간을 확인하거나 설정함 ( 시간 설정 등 )

┗  설정 기능은 root 계정만 실행 가능함

$ date => Wed Oct 14 21:05:00 KST 2026

 

[ who 명령 ]

┗  현재 시스템에 접속해 있는 사용자들을 조회할 수 있음

┗  사용자명, 터미널 정보, 접속시간, 로그인 시간 등을 조사함

$ who
junbin   pts/0        2026-10-14 10:30 (192.168.1.50)
root     pts/1        2026-10-14 11:05 (:0)

 

[ cal 명령 ]

┗  달력을 출력하는 명령

 

💡 6. 셸 변수

[ 수식의 확장 ]

┗  $[expression] 또는 $((expression))의 형태

┗  명령어를 수행하기 전에 셸은 위와 같은 수식을 먼저 계산함

echo $(( 10 + 5 ))
-> 수식 먼저 계산 후 값 출력

 

[ 변수의 확장 ]

┗  $변수는 변수의 값을 추출하여 확장됨

name="홍길동"
echo "안녕하세요, $name님!"

 

[ 셸 변수 ]

┗  셸 안에 임시로 데이터를 담아두는 공간(메모리 공간)을 의미함

┗  지역변수: 현재 셸에서만 유효한 변수

┗  환경변수: 현재 셸의 서브셸에서도 계속 유효한 "전역변수"

┗  export [variable] 명령: 지역변수를 환경변수로 만드는 명령

sub_var=123 // 지역변수
export my_var // 전역변수로 승격

┗  HOME, PS1, PATH, USER 등은 자주 사용되는 잘 알려진 환경변수임

 

[ 로그인과 환경 설정 파일 ]

┗  ~/.bash_profile:

- 로그인 셸이 시작될 때 수행되는 설정 파일
- 환경변수를 설정할 수 있으며, 보통 내부에서 '~/.bashrc'를 실행함

┗  ~/.bashrc:

- 로그인 후 셀(비로그인 셸)이 시작될 때 수행되는 설정 파일
- 보통 내부에서 /etc/bashrc를 수행하며, 개별 사용자를 위한 에일리어스 또는 함수를 정의함

'방송통신대학교 > 🐧 UNIX 시스템' 카테고리의 다른 글

[UNIX 시스템] 5강 - 리눅스 시작과 종료  (0) 2026.10.16
[UNIX 시스템] 4강 - 파일과 디렉터리  (0) 2026.10.15
[UNIX 시스템] 2강 - 리눅스 설치  (0) 2026.10.12
[UNIX 시스템] 1강 - 리눅스 소개  (0) 2026.10.05
'방송통신대학교/🐧 UNIX 시스템' 카테고리의 다른 글
  • [UNIX 시스템] 5강 - 리눅스 시작과 종료
  • [UNIX 시스템] 4강 - 파일과 디렉터리
  • [UNIX 시스템] 2강 - 리눅스 설치
  • [UNIX 시스템] 1강 - 리눅스 소개
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    오늘
    어제
    • 전체보기 (254)
      • 방송통신대학교 (108)
        • 🐧 UNIX 시스템 (5)
        • 📝 프로그래밍 언어론 (13)
        • ⚙️ 운영체제 (14)
        • 🧬 알고리즘 (10)
        • 🔢 자료구조 (14)
        • 💻 컴퓨터과학 개론 (15)
        • 📊 오픈소스기반 데이터분석 (3)
        • ⚙️ 컴퓨터의 이해 (11)
        • 🕸️ 이산수학 (11)
        • 🌍 유비쿼터스 컴퓨팅 (11)
        • 🖥️ 컴퓨터과학과 (1)
      • 공부 (72)
        • 📚백엔드 공부 (6)
        • ☕Java (23)
        • 🌳Spring (13)
        • ⚙️C (12)
        • ⚡Python (15)
        • JavaScript (1)
        • 🛢️Database (0)
        • Algorithm Problem Solving (2)
      • 네트워크 (7)
        • 📜HTTP (7)
      • 스파르타코딩클럽 (64)
      • 정보 (2)
      • 정리가 필요한 글 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    배열
    컴퓨터과학 개론
    컴퓨터과학과
    Java
    운영체제
    컴퓨터의 이해
    자료구조
    방송통신대학교
    함수
    방송대
    그래프
    알고리즘
    Python
    자바
    방통대
    프로그래밍 언어론
    spring
    파이썬
    C언어
    이산수학
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
junbin2
[UNIX 시스템] 3강 - 셸 사용하기
상단으로

티스토리툴바