-
시스템 프로그래밍 - 쉘, 쉘스크립트CS 2021. 5. 9. 11:54
쉘과 쉘스크립트
다룰 내용
- 리눅스 쉘 사용법
- 쉘 스크립트 사용법
쉘
쉘(shell): 사용자와 컴퓨터 하드웨어 또는 운영체제간 인터페이스
- 사용자의 명령을 해석해서, 커널에 명령을 요청해주는 역할
- 관련된 시스템콜을 사용해서 프로그래밍이 작성되어 있다.
쉘 종류
- Bourne-Again Shell (bash): GNU 프로젝트의 일환으로 개발됨, 거의 리눅스 디폴트
- Bourne Shell (sh)
- C Shell (csh)
- Korn Shell (ksh): 유닉스에서 가장 많이 사용됨
리눅스 기본 명령어
- 쉘이 제공하는 명령어
- 리눅스 기본 쉘이 bash 이므로, bash 에서 제공하는 기본 명령어
whoami: 로그인한 사용자 ID
whoami -> root
passwd: 로그인한 사용자 ID의 암호 변경
passwd
useradd, adduser
- useradd: 사용자 기본 설정 자동으로 X
- adduser: 사용자 기본 설정 자동으로 O
adduser kingsubin
su: 사용자 변경
- 보통 su - 와 함께 사용
- su root: 현재 사용자의 환경설정 기반, root로 변경
- su - root: 변경되는 사용자의 환경설정을 기반으로, root 전환su - root
sudo 명령어: root 권환으로 실행하기
- root 계정으로 로그인 하지 않은 상태에서 root 권한이 필요한 명령을 실행할 수 있도록
ex) sudo apt-get update
pwd: 현재 디렉토리 위치
pwd
cd: 디렉토리 이동
cd ~, cd -
ls: 파일 목록 출력
- * 는 임의 문자열
- ? 는 문자 하나
ls, ls -al ...
ls ????????
-> 8글자 찾기ls king*
-> 뒤에 임의 문자열
man rm: 메뉴얼 보기
man rm
파일 권한
- 파일마다 소유자, 소유자 그룹, 모든 사용자에 대해
- 읽고, 쓰고, 실행하는 권한 설정
- 소유자 접근 권한 정보는 inode 에 저장
- 사용자
- 소유자: 소유자에 대한 권환
- 그룹: 소유자가 속해 있는 그룹에 대한 권한
- 공개: 모든 사용자들에 대한 권한
- 퍼미션 종류, (권한기호)
- 읽기(r): 읽기 권한
- 쓰기(w): 쓰기 권한
- 실행(x): 실행 권한
chmod: 파일 권한 변경
- 기호문자를 사용하는 방법
- 숫자를 사용하는 방법
chown: 소유자 변경
chown [옵션][소유자:소유그룹][파일]
- 주로 사용하는 옵션
- chown -R root:root directory
- 소유자 그룹 변경
- chgrp [옵션][그룹][파일]
- ex) chgrp -R root directory
cat: 파일보기
ex) cat mysql.cnf
- mysql.cnf 파일 내용이 출력됨
head/ tail: head는 파일 시작부분, tail은 끝 부분을 보여줌
- mysql.cnf 파일 앞부분만 출력 (기본 10줄)
head mysql.cnf
- mysql.cnf 파일 뒷부분만 출력 (기본 10줄)
tail mysql.cnf
more: 파일 보기 (화면이 넘어갈 경우, 화면이 넘어가기 전까지 보여줌)
more mysql.cnf
- mysql.cnf 파일 내용이 출력됨
less: 똑같은 파일 보기인데 more 보다는 less 를 권장함
less mysql.cnf
rm: 파일 및 폴더 삭제
- 주로 사용하는 명령어 형태: rm -rf 디렉토리명
- r 옵션: 하위 디렉토리를 포함한 모든 파일 삭제 (recursive)
- f 옵션: 강제로 파일이나 디렉토리 삭제
rm mysql.cnf
기본적으로 리눅스에는 휴지통이 없다.
Standard Stream (표준 입출력)
- command 로 실행되는 프로세스는 세 가지 스트림을 가지고 있음
- 표준 입력 스트림 (Standard Input Stream) - stdin
- 표준 출력 스트림 (Standard Output Stream) - stdout
- 오류 출력 스트림 (Standard Error Stream) - stderr
- 모든 스트림은 일반적인 plain text로 console에 출력하도록 되어 있음
리다이렉션 (redirection)
- 표준 스트림 흐름을 바꿔줄 수 있다.
- >, < 사용
- 주로 명령어 표준 출력을 화면이 아닌 파일에 쓸 때
ex) ls > files.text
- ls 출력되는 표준 출력 스트림의 방향을 files.text 로 바꿔줌 (files.txt 에 ls 로 출력되는 결과가 저장됨)
ex) head < files.txt
- files.txt 파일 내용이 head 라는 파일의 처음부터 10라인 까지 출력해주는 명령으로 넣어짐 (files.txt 의 앞 10라인이 출력됨)
ex) head < files.txt > files2.txt
- files.txt 파일 내용이 head 로 들어가서, files.txt 의 앞 10라인을 출력
- head 의 출력 스트림은 다시 files2.txt 로 들어감
- head 는 files.txt 내용을 출력하지 않고, 해당 출력 내용이 다시 files2.txt 에 저장됨 (결과적으로 files.txt 의 앞 10라인이 files2.txt 에 저장됨)
ex) ls >> files.txt
- 기존의 files.txt 끝에 ls 출력 결과를 추가해줌
파이프 (pipe)
- 두 프로세스 사이에서 한 프로세스의 출력 스트림을 또 다른 프로세스의 입력 스트림으로 사용할 때 사용됨
ls | grep file
- ls 명령을 통한 출력 내용이 grep 명령의 입력 스트림으로 들어감
- grep file 는 grep 명령의 입력 스트림을 검색해서 file 이라는 문구가 들어 있는 입력 내용만 출력해줌
- 결과적으로, ls 명령으로 해당 디렉토리 또는 파일명에 file 이라는 문구가 있는지를 출력함
grep: 검색 명령
- grep [-option][pattern][file or directory name]
프로세스 vs 바이너리
- 코드 이미지 또는 바이너리: 실행파일
- 실행 중인 프로그램: 프로세스
- 가상 메모리 및 물리 메모리 정보
- 시스템 리소스 관련 정보
- 스케쥴링 단위
foreground process/ background process
- foreground process: 쉘에서 해당 프로세스 실행을 명령한 후, 해당 프로세스 수행 종료까지 사용자가 다른 입력을 하지 못하는 프로세스
- background process: 사용자 입력과 상관없이 실행되는 프로세스
- 쉘에서 맨 뒤에 & 를 붙여줌
ex) find / -name '*.py' > list.txt &
[1] 57
- [1]은 작업번호 (job number), 57은 pid (process ID) 를 나타냄
foreground process 제어하기
- ctrl + z: foreground 프로세스를 실행 중지 상태로 변경
- 맨 마지막 ctrl + z 로 중지된 프로세스는 bg 명령으로 background 프로세스로 실행 될 수 있음
jobs
: 백그라운드로 진행 또는 중지된 상태로 있는 프로세스를 보여줌- ctrl + c: 프로세스 작업 취소
프로세스 상태 확인 - ps
ps [option(s)]
- 주요 ps 출력 정보 항목
프로세스 중지 시키기
kill
- 사용법
kill (job number)
kill (PID)
kill -9 (number)
- 작업 강제 종료 옵션 -9
주로 사용하는 프로세스 명령
- ps aux | grep 프로세스명: 프로세스가 실행중인지 확인하고, 관련 프로세스에 대한 정보 출력
- kill -9 (pid): 해당 프로세스 강제 죽이기
- 명령 &: 다른 작업 해야하거나, 실행에 오랜 시간이 걸릴 경우 background로 실행
- ctrl + z: 프로세스 중지
- ctrl + c: 프로세스 종료
가상 파일 시스템
- 리눅스의 경우 모든 것은 파일이라는 철학을 따름
- 모든 자원에 대한 추상화 인터페이스로 파일 인터페이스를 활용
- 파일 네임스페이스
- A 드라이브 (A:/), C 드라이브 (C:/windows) (X)
- 전역 네임스페이스 사용
- ex) /media/floofy/text.txt
슈퍼블록, inode와 파일
- 슈퍼블록: 파일 시스템의 정보
- 파일: inode 고유값과 자료구조에 의해 주요 정보 관리
- ‘ 파일이름 : inode ‘ 로 파일이름은 inode 번호와 매칭
- 파일 시스템에서는 Inode를 기반으로 파일 엑세스
- inode 기반 메타 데이터 저장
리눅스 파일 구조
하드링크와 소프트링크
- cp: 파일 복사
- 1MB 사이즈를 가지고 있는 A 파일을 B 파일로 복사
- cp A B -> A, B 는 각각 물리적응로 1MB 파일로 저장
- 1MB 사이즈를 가지고 있는 A 파일을 B 파일로 복사
- 하드링크: In A B
- A와 B는 동일한 1MB 파일을 가르킴
- 즉, 동일한 파일을 가진 이름을 하나 더 만든것뿐
- inode 는 동일
- 전체 파일 용량은 달라지지 않음
- rm A 로 A 를 삭제하면 ? B 는 그래도 해당 파일 접근 가능
- ‘A : 해당 inode’ 정보만 삭제되고, inode 를 가진 실제 파일은 그대로 남음
- 소프트링크: ln -s A B
- Windows OS 의 바로가기와 동일
- ls -al 시 소프트 링크 확인 가능 (ex) lrwxr-xr-x 와 같이 맨 앞에 l 이 붙음)
- rm A 로 A 삭제시 B는 해당 파일 접근 불가
- 하드링크와 소프트링크 둘 다 어느 하나 파일을 수정하면, 각 파일 이름으로 동일한 내용 접근 가능
특수 파일
- 디바이스
- 블록 디바이스 (Block Device)
- HDD, CD/DVD 와 같이 블록 또는 섹터 등 정해진 단위로 데이터 전송, IO 송수신 속도가 높음
- 캐릭터 디바이스 (Character Device)
- 키보드, 마우스 등 byte 단위 데이터 전송, IO 송수신 속도가 낮음
ls -al
해서 봤을때 맨 앞에 b, c 와 같이 표시되어있음
- 블록 디바이스 (Block Device)
쉘 스크립트
- 쉘을 사용해서 프로그래밍 할 수 있음
- 서버 작업 자동화 및 운영을 위해 기본적으로 필요함
- 쉘 명령어를 기본으로 하되, 몇 가지 문법이 추가된 형태
기본 문법
- 파일로 작성 후, 파일을 실행
- 가장 위의 첫 라인은 “#!/bin/bash” 로 시작
- 실행 권한을 가지고 있어야 한다.
- 일반적으로 ‘파일이름.sh’ 와 같은 형태로 파일 이름을 작성
- echo: 화면 출력
- #: 주석
- 변수
- 선언
- 변수명=데이터
- 띄어쓰기 X
- 사용
- $변수명
- 선언
- 리스트 변수 (배열)
- 선언
- 변수명=(데이터1 데이터2 데이터3 …)
- 사용
- $
- $ -> @: 모든 데이터 출력
- $ -> *: 모든 데이터 출력
- ${# list[@]} -> # 붙이고 인덱스번호에 @: 배열 크기 출력
- 선언
- 미리 정의 되어 있는 지역 변수
- $$: 쉘의 프로세스 번호
- $0: 쉘 스크립트 이름
- $1 ~ $9: 명령줄 인수
- $*: 모든 명령줄 인수 리스트
- $#: 인수의 개수
- $?: 최근 실행한 명령어의 종료 값
- 0: 성공, 나머지는 에러라고 보면 됨
- 연산자
- expr: 숫자계산
- expr 를 사용하는 경우 ( ` ) 을 사용해야 함
- 연산자 * 와 괄호 () 앞에는 역슬래시와 같이 사용
- 연산자와 숫자, 변수, 기호 사이에는 공백 필요
- 조건문
- if 구분
- 탭으로 꼭 안띄워도 됨
- if [ 조건 ]; then 명령문; fi
- if 구분
- 조건문 문자비교
- 문자1 == 문자2 : 문자1과 문자2 일치
- 문자1 != 문자2 : 문자1과 문자2 불일치
- -z 문자 : 문자가 null 이면 true
- -n 문자 : 문자가 null 이 아니면 true
- 조건문 수치비교
- 값1 -eq 값2 : equal
- 값1 -ne 값2 : not equal
- 값1 -lt 값2 : 값1 < 값2
- 값1 -le 값2 : 값1 <= 값2
- 값1 -gt 값2 : 값1 > 값2
- 값1 -ge 값2 : 값1 >= 값2
- 파일 검사
- -e : 파일 존재하면 true
- -d : 파일 디렉토리면 true
- -h : 심볼릭 링크 파일
- -f : 일반파일이면 true
- -r : 읽기 가능이면 true
- -w : 쓰기 가능이면 true
- -x : 실행 가능이면 true
- -s : 크기가 0이 아니면 true
- -u : set-user-id가 설정되면 true
- 논리연산
- 조건1 -a 조건2 : AND
- 조건1 -o 조건2 : OR
- 조건1 && 조건2 : 양쪽다성립
- 조건1 || 조건2 : 한쪽 또는 양쪽 다 성립
- !조건 : not
- 반복문
- 기본 for 구문for 변수 in 변수값1 변수값2 …
dodone 명령문
- 기본 while 구문while [ 조건문 ]
dodone 명령문
- 기본 for 구문for 변수 in 변수값1 변수값2 …
- 압축 명령 tar
- 리눅스에서는 여러 파일을 한 파일로 묶은 것을 아카이브 라고 함
- 확장자는 .tar
- 리눅스에서 파일 압축은 두 단계로 진행
- 1. 아카이브로 만듬
- 2. gzip 프로그램을 사용해서 압축함 + 확장자는 .tar.gz
- 압축 명령어는 tar 를 사용하되, 옵션을 사용해서 gzip 기능을 사용함
- 리눅스에서는 여러 파일을 한 파일로 묶은 것을 아카이브 라고 함
- tar 주요 옵션
- x : 묶음 해제
- c : 파일 묶음
- v : 묶음/해제 과정을 화면에 출력
- z : gunzip 사용
- f : 파일이름을 지정
- 압축시 주로 사용하는 옵션
- tar -cvzf [압축된 파일 이름] [압축할 파일이나 폴더명]
- 압축 풀때 주로 사용하는 옵션
- tar -xvzf [압축 해제할 압축 아카이브 이름]
쉘 스크립트 예제
※ 출처
패스트캠퍼스 컴퓨터 공학 강의
'CS' 카테고리의 다른 글
네트워크 (2) 2021.05.31 운영체제 - 2 (0) 2021.04.24 운영체제 - 1 (0) 2021.04.18 리눅스 중요 명령어 (0) 2021.01.16 HTTP 8. 캐시와 조건부 요청 (0) 2021.01.08