cmod.ify

Shell 본문

BASIC/LINUX

Shell

modifyC 2026. 1. 7. 18:40
728x90
반응형

1. 셸(Shell) 개요 및 주요 기능

사용자가 명령 치면 커널한테 전달하고, 커널이 일한 결과 다시 사용자한테 보여주는 인터페이스임.

  • 명령어 해석기: 사용자 명령 읽어서 실행함.
  • 프로그래밍 (Shell Script): 여러 명령 묶어서 반복 작업 자동화 가능.
  • 환경 설정: 로그인할 때 실행되는 초기화 파일로 경로(PATH), 권한(umask), 변수 등을 사용자 맞춤형으로 세팅함.

2. 셸의 종류

종류 특징
sh (Bourne Shell) 최초의 셸. 기본기는 탄탄하지만 편의 기능 부족함.
bash (Bourne Again Shell) 리눅스 표준/기본 셸. sh 호환 + csh, ksh 장점
csh / tcsh C언어랑 문법 비슷함. BSD 유닉스 계열에서 많이 씀.
ksh (Korn Shell) AT&T에서 만듦. 기능 많음.
zsh (Z Shell) 요즘 대세. bash 기반에 강력한 자동완성, 테마 기능 추가됨.

3. 로그인 셸(Login Shell) vs 서브 셸(Sub Shell)

  • 로그인 셸: 접속하자마자 뜨는 첫 번째 셸. 종료(exit, Ctrl+D)하면 접속 끊김.
  • 서브 셸: 프롬프트에서 다른 셸 실행해서 들어간 상태. 종료하면 이전 셸로 돌아옴.

4. Bash 셸 주요 특징 (우분투 기본)

  • Alias: 긴 명령어를 짧은 별명으로 줄여 씀.
  • History: 이전에 쳤던 명령어 화살표 위아래로 다시 불러옴.
  • 연산: 자체적으로 산술 연산 가능.
  • Job Control: 백그라운드/포그라운드 작업 제어.
  • 자동 완성: Tab 키 누르면 파일명이나 명령어 자동 완성해줌.

5. 셸 확인 및 변경 방법 (실습 위주)

🔍 셸 정보 확인

  • 시스템 지원 셸 목록: cat /etc/shells
  • 현재 로그인 셸 확인: grep 계정명 /etc/passwd (맨 끝에 경로 나옴)

🔄 셸 변경 (chsh 사용)

명령어 형식: chsh [옵션] [계정명]

작업 내용 명령어 예시 비고
지원 셸 확인 chsh -l /etc/shells 내용 출력
로그인 셸 변경 chsh -s /bin/csh hapi hapi 계정 셸을 csh로 바꿈
다시 bash로 chsh -s /bin/bash hapi 절대경로 써야 함 (/bin/ 포함)

주의: 셸 변경하고 나면 바로 안 바뀜. 재접속해야 반영됨.


💡 경로(Path) 상식

  • 절대경로: 루트(/)부터 시작하는 불변의 경로. (예: /bin/bash)
  • 상대경로: 현재 위치(.) 기준 경로. 상위는 ..임.

6. 셸 내장 명령 (Built-in Commands)

일반 명령과 달리 별도의 파일 없이 셸 프로그램 내부에 포함된 명령임.

  • 특징: 메모리에 상주하므로 속도가 빠르고, 별도의 프로세스를 생성하지 않음.
  • 비교: * /usr/bin/pwd: 별도의 실행 파일 존재함 (file 명령으로 확인 가능).
    • cd: 셸 내부에 들어있음 (파일 경로 없음, file /bin/cd 해도 안 나옴).

7. 출력 명령 (echo & printf)

명령 특징 주요 사용법
echo 단순 문자열 출력 echo -n "Hello" (-n 옵션 사용 시 줄바꿈 안 함)
printf 형식 지정 출력 printf "%d + %d = %d\n" 1 3 4 (C언어 스타일)

8. 셸 특수문자 (Wildcards & Special Characters)

셸이 명령을 실행하기 전에 미리 해석해서 처리하는 기호들임.

📂 파일명 대체 및 범위 지정

  • * (Asterisk): 글자 수 상관없이 모든 문자 매칭 (예: ls t* -> t로 시작하는 전부).
  • ? (Question Mark): 딱 한 글자만 매칭 (예: ls t?? -> t로 시작하는 3글자 파일).
  • [] (Brackets): 괄호 안의 문자 중 하나와 매칭.
    • [135]: 1 또는 3 또는 5 중 하나.
    • [a-z]: 알파벳 소문자 범위.
    • [0-9]: 숫자 범위.
    • [가-힣]: 한글 전체 범위.

🏠 디렉토리 관련

  • ~ (Tilde): 현재 사용자의 홈 디렉토리 경로.
  • - (Hyphen): 바로 직전에 있었던 디렉토리로 이동 (cd -).

⚙️ 명령 실행 제어

  • ` (Backtick): 안의 명령을 실행한 결과값으로 치환함. (예: echo "Today is `date`")
  • ; (Semicolon): 앞 명령 성공 여부 상관없이 순차 실행 (A; B; C).
  • && (AND): 앞 명령이 성공해야만 다음 명령 실행 (A && B).
  • | (Pipe): 앞 명령의 출력을 뒤 명령의 입력으로 전달 (예: ls -al / | more).

🛡️ 인용구 및 이스케이프 (Quoting)

  • \ (Backslash): 바로 뒤에 오는 특수문자 1개의 기능을 무력화함 (일반 문자로 취급).
  • '' (Single Quotes): 모든 특수문자를 단순 문자로 취급함 (강력한 무력화).
  • "" (Double Quotes): 대부분 무력화하지만 $, \, ` 등 변수나 명령 치환은 허용함.

💡 한눈에 보는 특수문자 요약표

특수문자 의미 예시
* 모든 문자열 rm *.txt (모든 텍스트 파일 삭제)
? 한 글자 ls a?c.txt (abc.txt, akc.txt 등)
~ 홈 디렉토리 cp file1 ~ (홈으로 파일 복사)
; 무조건 순차실행 make; make install
&& 성공 시 실행 ./configure && make
| 결과 전달(파이프) ps -ef | grep python

 

9. 표준 입출력 장치 (Standard I/O)

리눅스는 모든 장치를 파일로 관리함. 각 장치는 고유의 번호(파일 디스크립터)를 가짐.

번호(FD) 이름 정의 기본 장치
0 stdin 표준 입력 키보드
1 stdout 표준 출력 모니터
2 stderr 표준 에러 모니터

10. 출력 리다이렉션 (Output Redirection)

모니터에 나올 결과를 파일로 돌리는 기능임.

기호 기능 설명
> 덮어쓰기 (Overwrite) 기존 파일 내용을 싹 지우고 새로 작성함.
>> 추가하기 (Append) 기존 내용 끝에 결과물을 이어 붙임.

  • 사용 예시:
    • date > date1.txt: 현재 시간을 파일에 저장 (기존 내용 삭제됨).
    • ls -F / >> date1.txt: 루트 디렉토리 목록을 파일 끝에 추가함.

11. 에러 리다이렉션 (Error Redirection)

명령 실행 중 발생하는 에러 메시지만 따로 관리할 때 사용함.

  • 기본 형식: 명령 2> 파일경로 (2번이 에러 번호이기 때문)
  • 에러 메시지 버리기: ls abc 2> /dev/null
    • /dev/null은 블랙홀 같은 곳이라 여기로 보내면 에러 메시지가 화면에 안 나옴.
  • 출력과 에러를 한곳에 담기: 명령 > 파일명 2>&1
    • 표준 출력(1)을 파일로 보내고, 에러(2)를 표준 출력(1)이 가는 곳으로 똑같이 보낸다는 뜻임.

12. 입력 리다이렉션 (Input Redirection)

키보드로 입력할 내용을 파일에서 읽어오도록 변경함.

  • 형식: 명령 < 파일경로 (또는 명령 0< 파일경로)
  • 용도: 파일 안에 적힌 데이터를 명령어나 프로그램의 인자로 한꺼번에 밀어 넣을 때 많이 씀.

13. 변수의 종류와 확인

리눅스 셸에서 사용하는 변수는 영향 범위에 따라 두 가지로 나뉨.

  • 셸 변수 (Local Variable): 현재 실행 중인 셸 세션에서만 유효함. 서브 셸로 내려가면 안 보임.
  • 환경 변수 (Environment Variable): 시스템 전체 또는 현재 셸에서 실행되는 모든 프로그램/서브 셸에 적용됨.

🔍 변수 확인 명령어

명령어 설명
echo $변수명 특정 변수의 값을 출력함 (변수명 앞에 $ 필수).
env 시스템 설정과 관련된 환경 변수만 싹 다 보여줌.
set 셸 변수, 환경 변수, 정의된 함수까지 전부 다 출력함.

14. 변수 생성·수정 및 삭제

변수 이름과 값 사이에는 공백이 있으면 절대 안 됨.

  • 셸 변수 생성: 변수명=값 (예: HYUNDAI=AUTOEVER)
  • 환경 변수로 등록: export 변수명=값 (이미 있는 셸 변수를 export 변수명만 해서 넘길 수도 있음)
  • 환경 변수를 셸 변수로 내리기: export -n 변수명 (시스템 전역 설정을 현재 셸 전용으로 바꿈)
  • 변수 삭제: unset 변수명 (메모리에서 해당 변수 날려버림)

15. 프롬프트 설정 (PS1)

프롬프트는 사용자가 명령을 입력하는 줄의 모양을 결정함. PS1이라는 환경 변수를 수정해서 바꿀 수 있음.

🛠️ 프롬프트 주요 특수 문자

기호 의미
\u 현재 사용자 이름 (User)
\h 호스트 이름 (Host)
\w 현재 작업 디렉토리의 전체 경로 (Working directory)
\W 현재 디렉토리의 마지막 이름만 표시
\T 현재 시간 (12시간 형식)
\! 현재 명령의 히스토리 번호

💻 설정 예시

  • 백업: PROMPT=$PS1 (망칠 수 있으니 기존 설정을 미리 저장해두)
  • 단순 문자열: PS1='LINUX ] ' -> 프롬프트가 그냥 LINUX ] 로 바뀜.
  • 경로 표시: PS1='[$PWD]' -> 대괄호 안에 현재 전체 경로가 나옴.
  • 복합 설정: PS1='[\u \T] \!$ ' -> [사용자 시간] 히스토리번호$ 형태로 나옴.
  • 원복: PS1=$PROMPT (저장해둔 값으로 다시 돌리기)

16. 주요 환경 변수 (PATH, LANG 등)

변수명 설명 및 특징
PATH 명령어를 입력했을 때 실행 파일을 검색할 디렉토리 목록. :으로 구분함.
LANG 시스템 로케일(언어, 국가 등) 정보. 한국어 설정 시 ko_KR.UTF-8 사용.
HOME 사용자의 홈 디렉토리 경로.
PWD 현재 작업 중인 디렉토리 경로.
SHELL 사용자가 현재 사용 중인 로그인 셸의 경로.
HISTSIZE 메모리에 저장할 명령어 히스토리 개수.

💡 PATH 활용 팁

  • 경로 추가: PATH="$PATH:~/bin" (기존 경로 뒤에 ~/bin 추가)
  • 직접 설치한 프로그램 실행법:
    • 1. 전체 경로를 alias로 등록.
    • 2. 경로를 PATH에 추가.
    • 3. 실행 파일을 이미 PATH에 있는 /usr/local/bin 등에 복사.

17. 환경 설정 파일 (Configuration Files)

로그인하거나 셸을 실행할 때 자동으로 로드되는 파일들임. 시스템 설정이 먼저 돌아가고 사용자 설정이 나중에 덮어씀.

🌍 시스템 환경 설정 (모든 사용자 적용)

  • /etc/profile: 전체 공통 환경 설정. 로그인 시 가장 먼저 실행됨.
  • /etc/bash.bashrc: bash 셸 공통 설정 (프롬프트, sudo 힌트 등).
  • /etc/profile.d/*.sh: 특정 명령어(언어 등)별 추가 설정 파일들.

🏠 사용자 환경 설정 (개별 사용자 적용)

  • ~/.profile: 사용자 정의 경로(PATH) 등 설정. 내부에 .bashrc 호출 코드가 있음.
  • ~/.bashrc: 별명(alias), 함수, 히스토리 크기 등 상세 설정.
  • ~/.bash_aliases: 별명을 따로 관리하기 위한 파일.
  • ~/.bash_logout: 로그아웃할 때 실행할 작업(화면 정리 등) 기록.

🔄 수정 사항 즉시 반영하기

환경 설정 파일을 고치면 재로그인해야 하지만, 아래 명령어로 즉시 적용 가능함.

  • . ~/.bash_aliases 또는 source ~/.bash_aliases

18. Bash 옵션 설정 (set 명령)

셸의 특정 기능을 켜거나(-o) 끌 때(+o) 사용함.

  • ignoreeof: Ctrl + D를 눌러도 셸이 바로 종료되지 않게 함.
    • 설정: set -o ignoreeof
    • 해제: set +o ignoreeof
  • noclobber: 실수로 중요한 파일을 리다이렉션(>)으로 덮어쓰는 것을 방지함.
    • 설정: set -o noclobber
    • 결과: 이미 존재하는 파일에 echo "test" > file 시도하면 에러 발생함.

 

728x90
반응형

'BASIC > LINUX' 카테고리의 다른 글

[LINUX] 프로세스  (1) 2026.01.08
[LINUX] FILE SYSTEM  (0) 2026.01.08
Vim 편집기 및 단축키  (1) 2026.01.06
리눅스 쉘(Shell) 기본 명령어  (0) 2026.01.06
OpenSSH 서버 설치 및 가상머신 포트 포워딩 설정  (0) 2026.01.06