cmod.ify
Shell 본문
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 |