ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시스템 프로그래밍 - 쉘, 쉘스크립트
    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 파일로 저장
    • 하드링크: 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
킹수빈닷컴