티스토리 뷰

쉘과 쉘스크립트

다룰 내용

  • 리눅스 쉘 사용법
  • 쉘 스크립트 사용법

쉘(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 파일로 저장
  • 하드링크: 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 와 같이 표시되어있음

쉘 스크립트

  • 쉘을 사용해서 프로그래밍 할 수 있음
  • 서버 작업 자동화 및 운영을 위해 기본적으로 필요함
  • 쉘 명령어를 기본으로 하되, 몇 가지 문법이 추가된 형태

기본 문법

  • 파일로 작성 후, 파일을 실행
  • 가장 위의 첫 라인은 “#!/bin/bash” 로 시작
  • 실행 권한을 가지고 있어야 한다.
  • 일반적으로 ‘파일이름.sh’ 와 같은 형태로 파일 이름을 작성
  • echo: 화면 출력
  • #: 주석
  • 변수
    • 선언
      • 변수명=데이터
      • 띄어쓰기 X
    • 사용
      • $변수명
  • 리스트 변수 (배열)
    • 선언
      • 변수명=(데이터1 데이터2 데이터3 …)
    • 사용
      • $
      • $ -> @: 모든 데이터 출력
      • $ -> *: 모든 데이터 출력
      • ${# list[@]} -> # 붙이고 인덱스번호에 @: 배열 크기 출력
  • 미리 정의 되어 있는 지역 변수
    • $$: 쉘의 프로세스 번호
    • $0: 쉘 스크립트 이름
    • $1 ~ $9: 명령줄 인수
    • $*: 모든 명령줄 인수 리스트
    • $#: 인수의 개수
    • $?: 최근 실행한 명령어의 종료 값
      • 0: 성공, 나머지는 에러라고 보면 됨
  • 연산자
    • expr: 숫자계산
    • expr 를 사용하는 경우 ( ` ) 을 사용해야 함
    • 연산자 * 와 괄호 () 앞에는 역슬래시와 같이 사용
    • 연산자와 숫자, 변수, 기호 사이에는 공백 필요
  • 조건문
    • if 구분
      • 탭으로 꼭 안띄워도 됨
    • if [ 조건 ]; then 명령문; fi
  • 조건문 문자비교
    • 문자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
    • 명령문
  • 압축 명령 tar
    • 리눅스에서는 여러 파일을 한 파일로 묶은 것을 아카이브 라고 함
      • 확장자는 .tar
    • 리눅스에서 파일 압축은 두 단계로 진행
      • 1. 아카이브로 만듬
      • 2. gzip 프로그램을 사용해서 압축함 + 확장자는 .tar.gz
    • 압축 명령어는 tar 를 사용하되, 옵션을 사용해서 gzip 기능을 사용함
  • tar 주요 옵션
    • x : 묶음 해제
    • c : 파일 묶음
    • v : 묶음/해제 과정을 화면에 출력
    • z : gunzip 사용
    • f : 파일이름을 지정
  • 압축시 주로 사용하는 옵션
    • tar -cvzf [압축된 파일 이름] [압축할 파일이나 폴더명]
  • 압축 풀때 주로 사용하는 옵션
    • tar -xvzf [압축 해제할 압축 아카이브 이름]

쉘 스크립트 예제

Hello bash 화면에 출력하기
변수명 화면에 출력하기
리스트에 담고 각 정보 출력하기
쉘프로세스번호, 쉘스크립트 이름, 모든 명령인수리스트, 인수개수 출력하기
(10 + 20) / 8 - 8 계산하기
두 인자값 받아서 다르면 “different values” 출력하기
첫번째 인자가 두번째 인자보다 크면 이 인자를 출력하기
해당 파일이 존재하는지 아닌지를 출력하기
두 인자값 받아서, 같으면 “same values”, 아니면 “different values” 출력
현재 디렉토리에 있는 파일과 디렉토리 출력 for
현재 디렉토리에 있는 파일과 디렉토리 출력 while
백업하는 코드
로그파일 정리하는 코드


※ 출처

패스트캠퍼스 컴퓨터 공학 강의

'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