The Unix Shell

sidamo ·2023년 8월 24일
0

The Odin Project

목록 보기
1/4

Software Carpenty의 The Unix Shell 강좌 내용을 정리했습니다. 모든 내용과 이미지는 해당 강좌에서 발췌하였습니다.

01. Introducing the Shell

Background

컴퓨터와 인간의 상호작용

  • GUI : 직관적이지만 복잡하고 반복작업의 효율성이 떨어짐
  • CUI : 비교적 덜 직관적이지만 반복의 자동화가 수월하고 명령전달이 빠름

The Shell

쉘 = 사용자가 명령어를 입력할 수 있는 프로그램

  • Bash : 현대 Unix의 기본 쉘
  • Git Bash : 윈도우 환경에서 Bash 인터페이스로 Git을 사용하게 해주는 툴
  • 명령어들의 나열이 스크립트로 쓰여질 수 있음 => 효율성 증가

02. Navigating Files and Directories

  • pwd : print working directory

  • / : 첫글자로 오는 경우 root, 경로 중간에 사용되면 seperator를 의미

  • ls : 현재 directory의 내용물을 표시

    • -F : 마커로 이해하기 쉽게 분류함
      / : directory
      @ : link
      * : excutable
      없음 : file
    • -R : 모든 하위 경로를 계속해서 표시함(Recursively)
    • -l : 권한, 소유자, 크기, 수정시간 등의 추가적인 정보까지 포함하여 목록으로 나열(long listing format)
    • -h : -l과 함께 사용되며 크기를 문자 접미사로 표시(human readable)
    • -t : 알파벳순 대신 최근 수정된 순으로 나열
    • -r : reverse order
      옵션들을 붙여서 사용할 수 있음(-lt..)
    • -a : show all
      아래와 같은 모든 파일과 디렉토리를 표시(숨긴 것 포함)
      .으로 시작하는 파일 : 숨김파일로 보통 프로그램들에 대한 설정을 담고 있음, 쉘이 복잡해지는 것을 막기 위해 사용됨
      .bash_profile : 쉘 설정을 담고 있는 파일

      ./ : 현재 디렉토리
      ../: 상위 디렉토리

  • clear : 윈도우와는 다르게 스크롤하면 이전 화면이 남아있음

  • man : Linux/Mac의 내장 명령어 메뉴얼

    • B, 스페이스바 : 페이지 넘김↕️
    • / : 결과내 검색
    • N, Shift+N : 검색결과 이동↕️
    • Q : 종료

    GNU 메뉴얼
    https://www.gnu.org/manual/manual.html

  • cd : change directory, 경로 이동에 사용
    옵션 없이 호출하면 home 리턴 -> home의 의미
    • absolute path : 루트에서 현재 위치까지의 경로를 의미
      pwd -> 현재 위치의 절대경로 출력
    • relative path : 현재 위치에서 시작되는 경로
    • ~ : home으로 해석됨, 경로 첫번째 자리에서만 동작함
    • - : 이전 경로로 해석됨

쉘 명령어의 문법 구조

  • OPTION : 명령어의 행동을 변형시킴
    • - : short options, 쉘에 직접 입력할때 주로 사용
    • -- : long options, 스크립트에서 주로 사용
  • ARGUMENT : 명령어에게 대상을 지정

인자 없는 옵션의 단독 호출을 switch, flag라고 부름

각각의 부분은 공백으로 구분됨, 대문자 구분

  • Tab : 쉘에서 입력중 Tab키를 누르면 자동완성(tab completion), 두번 누르면 검색결과 표시

03. Working With Files and Directories

디렉토리 생성

  • mkdir
    • -p : 공백으로 구분된 인자에 대하여 하위경로(nested subdirectory)를 포함하여 생성
      ($ mkdir -p /a/b /c/d)
      p 옵션을 주지 않을 경우 중간의 디렉토리가 존재하지 않는다면 오류 발생

파일과 디렉토리를 위한 좋은 네이밍

  1. 공백을 사용하지 말 것.
  • 공백은 인자들을 구분할때 사용되므로 오류가 발생할 수 있음
  • 공백 대신 -/_를 사용
  1. 대쉬로 시작하지 말 것.
  • 옵션으로 해석되기 때문
  1. 되도록이면 알파벳, 숫자, ., -, _만 사용할 것.
  • 특수문자들은 특별한 의미를 가지고 있는 경우가 많음
  • 예키지 않은 동작을 초래할 수 있음
  • 특수문자나 공백을 사용하려면 전체를 ""로 감싸줄 것
  • nano : GNU 텍스트 에디터, pico 에디터의 강화판
    _GNU : 상용 Unix에 호환되는 운영체제와 그에 호환되는 자유 소프트웨어(상업적 이용까지도 무료) 프로젝트\ _
    • plain text만 읽고 쓸 수 있음
    • $ nano draft.txt
      파일이 존재하지 않는 경우 생성함
      $ touch draft.txt 도 존재하지 않는 파일을 생성함
      → 결과값을 파일에 추가하는 프로그램을 만들 때 유용함

Filename extensions

something.extension
파일이 어떤 종류의 데이터를 담고 있는지 사람 혹은 프로그램에게 알려주는 convention.
파일은 2진수만을 담고 있고 그것을 해석하는 규칙들이 다양한 것이다.
확장자는 아무것도 보증하지 않음.

파일과 디렉토리의 이동, 복사, 삭제

  • mv : move, 파일이나 디렉토리를 이동시킴
    • 첫 번째 인자 = 대상, 두 번째 인자 = 위치
    • $ mv thesis/draft.txt thesis/quotes.txt 이름까지 지정 → rename
    • 이름이 겹칠 경우 덮어쓰기 때문에 주의해야함
    • -i : interactive, 겹치거나 할 경우 물어봄
  • cp : mv와 같지만 복사함
    ls를 두 개의 인자로 호출해서 결과가 올바른지 확인할 수 있음
    • -r : recursive, 하위의 모든 내용물을 복사함
  • rm : remove
    • -i : interactive, 지우기 전 확인
    • -r : rm은 파일에 대해서만 동작하지만 재귀옵션으로 내용물을 포함한 하위 디렉토리를 모두 지울 수 있음

복수 파일, 디렉토리에 대한 적용

  • mv, cp 등에서 3개 이상의 인자가 주어지는 경우
    • 주어진 인자들을 모두 마지막 인자의 위치에 대해서 적용시킴

와일드카드

* : 하나 이상의 문자(문자가 없을 수 있음)
? : 하나의 문자(항상 문자가 있음)


04. Pipes and Filters

쉘의 가장 강력한 기능들 → 명령어를 조합하여 새롭게 활용

  • wc : word count / 파일의 줄, 단어, 문자를 셈
    • l : line
    • w : word
    • c : character(byte)
    • m : character(multi-byte)
$ wc -l *.pdb > lengths.txt 

pdb (protein data bank format)

> : redirect, 명령어의 실행 결과를 파일로 출력, 파일이 없으면 생성, 있으면 덮어씀.

  • cat : concatenate(연관시키다), 파일의 내용을 출력함, 다수의 파일 → 덧붙임/병합

  • less : 파일의 내용을 스크롤, 검색 가능한 뷰어를 통해 큰 화면으로 출력

  • sort : alphanumerical순으로 정렬(아스키코드), 파일에 영향을 끼치지 않고 결과를 반환.

    • -n : numerical, 작은 수부터
  • head : 파일의 시작부터 일부분을 출력, 내용을 빠르게 확인할 수 있음

    • -n n : n번째 줄까지를 출력
    • tail : head와 비슷하지만 파일의 끝부분부터 출력
  • cut : 파일의 일부를 제거

    • tab 문자로 줄을 구분함
    • -d : delimiter(구획 문자), 구획문자 지정
    • -f : 구분된 열 지정
  • uniq : 인접한 줄에서 중복된 내용을 제거, 보통 sort와 함께 사용됨

    • -c : 항목별로 중복되는 횟수 표시

$ sort -n lengths.txt > lengths.txt
결과를 다시 같은 파일에 저장하는 경우 파일이 손상됨

  • echo : 전달받은 인자를 출력함

>>>의 차이

	$ echo hello > test1.txt
	$ echo hello >> test2.txt

>는 파일을 새로 덮어쓰지만 >>는 append, 파일의 끝에 내용이 추가됨


결과를 다른 명령어로 보내기

$ sort -n lengths.txt | head -n 1

| : pipe, 왼쪽 명령어의 결과를 오른쪽 명령어에 인자로 전달함.

정렬을 위한 중간 파일의 필요가 없어져서 효율이 증가

명령어 결합하기

pipe를 합성함수처럼 연속적으로 사용할 수 있음

$ wc -l *.pdb | sort -n | head -n 1

함께 작동하도록 만들어진 도구들

프로그램들을 연결한다는 아이디어 ➡️ 유닉스가 성공한 이유

pipes and filters

프로그래밍 모델
많은 기능을 갖춘 거대한 프로그램보다 심플하고 연동이 잘 되는 여러 개의
작은 프로그램들을 만들기
filter : wc, sort같은 stream 입력을 stream 출력으로 변환시키는 프로그램

거의 모든 유닉스 프로그램은 이런 pipeline으로 작동함
→ 입출력이 standard input, standard output으로 표준화되어있기 때문
→ 이런 설계 철학을 따라야 사용자들도 pipeline을 통해 효율적으로 활용할 수 있음

The best way to use the shell is to use pipes to combine simple single-purpose programs (filters).


05. Loops

shell-lesson-data/exercise-data/creatures
basilisk.dat minotaur.dat unicorn.dat
목표 ➡️ 각 생물의 '문'을 출력

  • 의사 코드를 이용한 general form of loop
# The word "for" indicates the start of a "For-loop" command
for thing in list_of_things 
#The word "do" indicates the start of job execution list
do 
    # 들여쓰기는 필요없지만 가독성을 높여줌
    operation_using/command $thing 
# The word "done" indicates the end of a loop
done  
  • 수정한 예시
for filename in basilisk.dat minotaur.dat unicorn.dat
do
	echo $filename
    head -n 2 $filename | tail -n 1
done
  • 결과
basilisk.dat
CLASSIFICATION: basiliscus vulgaris
minotaur.dat
CLASSIFICATION: bos hominus
unicorn.dat
CLASSIFICATION: equus monoceros

FOLLOW THE PROMPT
for문을 입력하고 return하면 쉘 프롬프트가 $에서
done을 return 할 때까지 >로 바뀜, 명령어를 마무리하지 않았다는 것을 의미
;은 한 줄에서 두 명령어를 구분할 때 사용됨

  • 변수 : 루프를 돌며 순차적으로 리스트의 항목이 변수에 할당됨

    • $ : 쉘 인터프리터가 변수로 해석함
    • 연관성이 있고 이해하기 쉬운 변수명을 사용해야함
    • 프로그램은 사람이 이해할 수 있을 때만 유용하다.
  • history : 최근에 사용한 명령어를 번호로 모두 나열함

    • !번호 : 명령어를 다시 실행함
    • $ history | tail -n 5 : 가장 최근 것들을 유용하게 표시
  • Ctrl + R : reverse-i-search, 가장 최근의 명령어를 검색할 수 있음
    누를 때마다 다음 검색

  • !! : 가장 최근의 결과

  • !$ : 최근에 입력에서 마지막 단어

루프를 사용할때는 한 번에 많은 실수가 발생할 수 있기 때문에
echo로 실행될 명령어를 미리 확인하는 것이 좋음.


06. Shell Scripts

  • *.sh : 쉘 스크립트, bash로 실행
    • $n : 쉘 스크립트에서 실행할때 전달받은 n번째 인자
    • $@ : 공백으로 구분된 각각의 모든 인자
    • $* : 모든 입력이 하나의 인자로 해석됨
    • 인자를 변수로 받는 경우 ""로 감싸서 공백에 대비
    • # : 주석

Bash Alt 단축기 사용하기
터미널 ➡️ 설정 ➡️ 프로파일 ➡️ 키보드 ➡️ Option을 Meta키로

$ history > test.sh

test.sh에는 history > test.sh가 포함됨

  • 쉘은 명령어를 실행하기 전 항상 로그에 기록함
    → 충돌이나 오류에 대비하기 위함
  • history | head -n | tail -n > recent.sh
    history를 이용하여 간편하게 스크립트를 만들 수 있음
  • Shell Expansion : 쉘에 입력한 내용이 특수한 의미로 해석되는 것 ➡️ 쉘 자체적으로 의미를 대체시킴

쉘 심화자료


07. Finding Things

Grep

Global/Regular Expression/Print

  • 유닉스 에디터들의 공통적인 기능과 동명의 CLI 프로그램

  • 파일에서 패턴을 포함하는 줄을 찾아서 출력함

  • 기본적으로 패턴은 정규표현식을 따름

  • Options

    • -w : whole-word match

    • -n : 줄 번호를 표시

    • -i : case insensitive, 대소문자 구분안함

    • -v : invert, 패턴이 일치하지 않는 줄만 출력

    • -r : recursively, 하위 디렉토리까지 모두 탐색

Find

$find /path -options
grep과는 달리 파일 자체를 찾음

  • tree : 디렉토리를 tree 구조로 보여줌(맥에는 기본x, brew로 설치)
  • find . : current working directory
  • -type d : directory only
  • -type f : file only
  • $find . -name *.txt : 쉘에 의해 즉시 와일드카드가 expansion되어서 CWD의 텍스트파일만 표시됨
    ➡️""로 패턴을 묶어주어야 올바른 결과가 나옴

$() : 쉘이 명령어를 실행하기 전 괄호 내부를 먼저 확장시킴
→ 임의의 명령어를 와일드카드처럼 사용할 수 있음


출처 및 참고

https://swcarpentry.github.io/shell-novice/index.html
https://www.theodinproject.com/lessons/foundations-command-line-basics#assignment

profile
메모장

0개의 댓글