Linux 정리 - Udemy

Udemy

Linux

Ubuntu

11/28/2020


Shell과 Command의 차이

  • Command는 terminal에 치는 text에 불과하다.
  • Shell은 Command를 해석하는 프로그램이다.
  • Shell에 따라 같은 Command도 다른 방식으로 해석된다.
  • Terminal은 Shell로 연결되는 window이다.
  • Command는 대소문자가 구별되어야한다.

Linux란?

Richard Stallman이 1983년 시작한 오픈소스 소프트웨어 GNU(Gnu is Not Unix) OS로부터 시작되었다.
Free Software의 4 freedoms는 GNU Public License, GPL에 의해 보장되는데, 1991년 Linus Tovalds가 GPV v2.0하에 Linux kernel을 개발하였다. Linux는 GNU기반의 OS에 올려진 커널만을 의미하며, 해당 OS를 정확한 명칭으로 "GNU/Linux"라고 부른다.

Command

commandName -options inputs

  • 이때 options 앞의 dash는 2개를 붙이는 경우도 있으므로, 해당 command의 documentation을 확인할 것.
    • '-'의 경우는 short option. Unix traditional standard를 따른 형태
    • '--'의 경우는 long option. GNU extension을 따른 형태
  • <mandatory> : 필수 요소
  • [option1 | option2 | option3] : 선택 요소
  • ... : 하나 이상 사용할 수 있음

개념

PATH(환경변수)에서 해당 command에 대한 프로그램을 불러오는 것이 command. *PATH는 echo $PATH 커맨드로 확인할 수 있다.

Standard Data Stream과 redirection, piping

Standard Data Stream(표준 스트림) : Command의 Input, Output, Error의 데이터 흐름을 통틀어 일컫는 말. 텍스트로 이루어져 있다.

  • Standard Input : 0, 키보드로부터 터미널에 입력된 유저의 input
  • Standard Output : 1, Shell에서 해석된 커맨드를 수행한 결과물, default는 terminal에 출력.
  • Standard Error : 2, Shell에서 해석된 커맨드를 수행하였으나 발생한 에러. default는 terminal에 출력.

redirection : Output과 Error의 방향을 바꾸는 것 (default 터미널에서 파일 등으로 변경)

  • num > destination : destination에 num 덮어쓰기
  • num >> destination : destination 끝부분에 num 추가하기(삽입)
  • num < source : num에 source를 입력하기

piping : redirection 중 Output을 다른 Command의 Input으로 연결하는 경우

  • Command 1 | Command 2 : Command 1의 output을 Command 2의 input으로 pipingtee : piping에 사용되는 data stream의 snapshot을 출력(파일에 저장 가능)

특수한 command

  • uname - 시스템 정보 출력
    • -o : 운영체제 정보
  • man -options inputs - 메뉴얼 열람
    • -k : 해당 inputs(검색어)이 존재하는 섹션들을 search -> 섹션은 Manual Structrue Cheat Sheat 참조
    • man sectionNum inputs로 해당 섹션의 inputs 관련 메뉴얼 열람 가능.
    • SYNOPSIS에 command의 사용법이 나와있다.
  • help - 도움말. man과 비슷
    • man으로 나오지 않는 커맨드는 help를 사용하자
  • tee - piping 도중 data stream snapshot 제공
  • xargs - piping 도중 data stream을 command의 특수한 input 형태에 맞게 변환
    • Command 1 | xargs Command2
  • alias - 특정 pipeline에 nickname을 붙여 재사용할 수 있도록 만듦
    • alias <별칭>='실제 커맨드'
  • $(<Command>) : $는 Subshell을 호출하여, 괄호 안의 커맨드를 실행한 output을 해당 자리에 채워넣는다.

자주 쓰이는 Command

  • history - 사용했던 명령어 목록 출력
    • history의 line number를 확인 한 뒤 !<line number>로 해당 명렁어 불러오기
    • !!로 최근 명령어 재입력
    • -c : 히스토리 삭제
  • ls - 현재 directory 내용물 리스트화
    • -l : longform으로 출력
      • permission 정보도 제공됨. X/XXX/XXX/XXX 총 10자리
      • 앞에서부터 directory 여부, 소유자 권한, 그룹 권한, 모든 사용자의 권한을 의미한다.
      • r(read), w(write), x(execute)로 기록되어있다.
    • -h : -l이나 -s로 파일 사이즈를 불러올 때, 읽기 쉬운 단위로 변환(K, M 등)
    • 파일명을 명시할 경우 파일 정보 출력. 이때 파일명에 regular expression 사용가능.
  • pwd - 현재 위치 출력
  • cat - concatenate files하고 output을 print한다.
    • 0,1,2 등의 data stream을 이용하여 파일을 합치거나 할 수 있다.
  • mkdir - 디렉토리 생성
    • -p : 명시한대로 path 생성
    • {a,b,c,d}(={a..d}) : brace를 활용하여 디렉토리명 리스트화 가능
  • touch - 파일 생성, mkdir과 사용법 비슷
  • rm - 삭제
    • [a,b] : a나 b를 넣어서 해석할 것
    • -r : recursively. 디렉토리 내부의 모든 파일을 포함하여 일괄 삭제
  • cp - 복사
    • -r : rm의 -r과 같음.
  • locate : 시스템 전체에서 파일 검색. 패턴 파일 검색이 가능하며 리눅스 파일 목록 DB를 참조하므로 find에 비해 속도가 매우 빠름
    • 사용하기 전에 updatedb를 꼭 해줄것. 리눅스 cron에 등록되어있어 매일 새벽에 자동으로 업데이트하기는 함.
    • -e, --existing : 검색했을 때 존재하는 파일만 출력
    • -L, --follow : 잘못된 symbolic link를 제외하고 출력. default옵션이며, --nofollow를 통해 반대기능을 사용가능.
    • -i, --ignore-case : 대소문자 구별 X
    • -l, --limit, -n <숫자> : 지정 갯수만큼 검색
  • find - 지정 위치 내부에 있는 모든 폴더와 파일에 대해 검색.
    • -maxdepth <숫자> : find할 깊이 설정
    • -type <타입> : 타입 지정 검색, f일경우 file, d일경우 directory...
    • -name "<이름>" : 이름 지정 검색. regular expression 사용 가능. -iname 시 대소문자 무시
    • size <사이즈> : 사이즈 지정 검색. +100k시 100kb 이상, -10M시 10MB 이하.
      • size를 여러개 지정할 수 있음. default는 and 조건. -o를 넣어 or 조건으로 변환 가능
    • -exec <커맨드>\; : find의 각 결과물마다 커맨드를 실행
  • less - 파일 내용 열람. 들어가서 열람하므로 cat과 달리 내용이 터미널에 남지 않음

잡다한 Command

  • cal - 캘린더 출력
    • -y : 올 해 달력 전체 출력
    • <연도> : 당해년도 달력 전체 출력
    • -A <숫자> / -B <숫자> : 해당 일자의 <숫자>개월 이후(after), 이전(before) 비교
  • date - 현재일시 출력(타임존 기준)
  • tty - 표준입력장치에 연결되어 있는 terminal의 파일명(path포함)을 출력
  • cut - input을 특정 기준에 따라 분리
    • --delimiter "기준" : 분리 기준 설정
    • --field <숫자> : 분리한 것들 중 해당 index(1부터 시작)의 column을 output으로 가져옴
  • wc - 입력물의 word 갯수를 계산
    • -l : 1 line당 1 word로 계산
  • tac - output을 vertically reversing
  • rev - output을 horizontally reversing
  • head - 파일 내용물의 윗부분 출력. default 10줄
    • -n : 나타낼 line 수 설정
  • tail - 파일 내용의 아랫부분 출력. head와 작동방식 유사
  • sort - 파일내용물 정렬
    • -r : reverse 정렬
    • -h : 정렬기준 human readable. 웬만한 sorting key 다 작용
    • -n : 정렬기준 numeric
    • -M : 정렬기준 month
    • -u : 중복 제거하여 정렬
    • -k <컬럼 인덱스>: column number로 key(기준) 선택하여 정렬
  • grep - Text Content 내에서 특정 문자열 찾아 해당 line 반환. Content는 파일일수도 있고, ls 등 명령어의 output일수도 있음.
    • -c : 해당 문자열의 개수 반환
    • -i : 대소문자 구별 X
    • -v : 검색결과 반전. 해당 문자열을 가지지 않은 검색결과 출력
  • tar - archiving하여 tar파일 생성(여러개의 파일을 하나로 모은 것)
    • -c : 새로운 archive 생성, 기존 archive 덮어쓰기
    • -v : archive된 파일들 리스트 출력(처리되는 과정출력)
    • -f : archive file 사용 또는 device archive
    • -x : extract. 묶인 파일들 추출
    • -z : gzip으로 압축
    • -j : bzip2로 압축
  • 압축관련
    • gzip : tar파일 압축
    • gunzip : 압축해제
    • bzip2 : tar파일 압축, gzip보다 일반적으로 더 효율이 좋은 압축(그만큼 더 느림)
    • bunzip2 : 압축해제
    • zip : 파일들 압축
    • unzip : 압축해제
    • 이외에도 압축 알고리즘에 따라 다양한 프로그램이 있음.

Linux File System

구조

리눅스의 파일 시스템은 역트리형태로 되어있으며, 최상위에 root directory가 위치한다.

  • / : root directory. 최상위 parent node. 윈도우의 administrator과 같다.
    • /bin : 일반적인 user command binaries를 저장한다. ex - date, cat, cal
    • /boot : 부팅 가능한 linux kernel과 bootload config 파일을 저장
    • /dev : develop이 아니라 devices를 의미. devices와 관련된 모든 파일들을 저장
      • tty = terminal
      • fd=floppydisk
      • [sd or hd] = harddisk
      • ram=RAM
      • cd=CD-ROM
    • /etc : Administrative Configuration files. 이 설정들의 포맷은 Linux Manual 섹션 5에 나와있음.
    • /home : regular users를 저장하는 directory. root 유저가 아닌 일반 유저의 권한은 home 내의 해당 user directory까지만 작용한다.
    • /media : 이동식 미디어(USB, 외장하드)가 마운트되는 곳
    • /lib : /binsbin에 있는 어플리케이션들이 공유하는 라이브러리
    • /mnt : 외부 장치가 마운트하는 위치. 그러나 일반적으로 /media를 더 많이 사용
    • /misc : 시스템 아키텍쳐의 독립적인 자료들.
    • /opt : sw의 additional(optional)을 저장
    • proc : 시스템 자원에 대한 정보 저장
    • sbin : root 사용자를 위한 administrative 커맨드 binaries 저장
    • tmp : 구동중인 applications의 temporary files
    • usr : 시스템이 아닌 일반 사용자들과 관련된 파일을 저장, (일반적으로) 설치 이후에 변경되지 않음
    • var : 다양한 어플리케이션에 의해 사용될 수 있는 variable data들의 모음. 시스템 로그파일도 종종 여기에 기록된다.

Extensions

Windows와는 달리, Linux는 확장자가 파일의 포맷을 결정하지 않는다(따라서 확장자를 변경해도 파일 형태가 변하지 않는다) 그러나, 리눅스에 설치된 sw는 확장자를 토대로 파일 포맷을 추측하여 실행하므로 확장자를 일치시켜줄 필요가 있다.

Bash Script

작성법

반드시 첫 줄에 #!/bin/bash를 넣어 아래의 command를 bash interpreter로 해석하라고 명시한다.

bash가 아닌 다른 스크립트 파일로 인식되도록 하고 싶다면, !<특정 인터프리터 경로>를 첫 줄에 명시한다.

SHELL
#!/bin/bash
<커맨드 등록>

사용법

bash <bash 스크립트 파일>

환경변수 등록법

.bashrc 에 다음과 같이 등록한다.

SHELL
PATH="$PATH:$HOME/bin"

이후 ~/bin 폴더 내에 bash script 파일을 넣는다.

이로써 bash script 파일이 환경변수에 등록되어, sh 파일명으로 해당 명령어를 호출할 수 있다.

1라인짜리 script를 등록하고 싶다면, 이 방식이 아니라 .bash_aliases 파일에 alias를 등록한다.

Cron Job 수행하기

crontab 사용법

crontab -e 이후 에디터를 고른다.(select-editor 명령어로 미리 선택할 수 있다)

각 cron은 한 row로 구별되고, blank로 구별되는 6개의 column을 가진다.

<분(0-59)> <시(0-23)> <일(1-31)> <월(1-12)> <요일(0-7)> <bash 스크립트파일>

이때 요일의 0과 7은 일요일이며, 1-6은 월-토이다. 흔히 사용하는 * * * * * command, 별이 다섯개인 경우는 매분 cron을 수행하는 것이다. 각 시각을 기록할 때 '/'(나누기), ','(반점) 등을 사용할 수 있다. 이 주기를 표시해주는 웹사이트도 있다.

Open Source Software

Repository

Linux 배포판의 공식 repository에는 널리 사용되는 주요 패키지들의 업그레이드를 지원한다.

Ubuntu에는 총 4종류의 repository가 존재한다.

  1. Main - 표준적(Canonical)으로 관리됨(Free, Open Source)
  2. Universe - 특정 단체(Community)에 의해 관리됨(Free, Open Source)
  3. Restricted - 사유권한이 있는 소프트웨어(Proprietary, Maybe Open Source)
  4. Multiverse - 저작권법에 의해 제한됨(Proprietary, Maybe Open Source)

Package Archive 버전 확인법

lsb_release -a에 나오는 Codename을 확인한다.

apt

apt란? : package 관리 도구로, ubuntu를 비롯한 debian 계열의 리눅스에서 사용된다.

available package list는 /var/lib/apt/lists(=apt-cache)에 저장된다.

apt-cache

현재 설치된 패키지와 관련된 명령을 수행할 수 있다.

  • search - 설치된 패키지 검색
  • show - 해당 패키지의 세부 정보를 확인

apt-get

package database(cache)를 바탕으로 설치, 업그레이드, 삭제 등을 수행한다.

  • update - apt-cache를 업데이트한다.
  • upgrade - cache를 바탕으로 시스템에 설치된 모든 소프트웨어를 업그레이드한다.
  • remove - 패키지를 삭제한다. 단, dependancy는 삭제하지 않는다. 따라서 추천되지 않는 방식.
  • purge - 패키지를 삭제한다. dependancy도 함께 삭제한다.
  • autoremove - 시스템에서 사용되지않는 dependancy을 모두 삭제한다,
  • clean - 다운로드한 압축 패키지 archive들을 모두 삭제한다.
  • autoclean - 더이상 접근 불가능한 압축 패키지 archive들만 삭제한다.

따라서 upgrade전에 update를 먼저 수행해주어야한다.

repository 패키지 source 접근하기

/etc/apt/sources.list에서 deb-src 항목을 주석해제하여 unstable한 파일을 받을 수 있도록 설정한다. 이후 apt-get source <패키지명>을 이용해 패키지 소스파일을 받을 수 있다.


해당 포스팅은 Udemy의 'Linux Mastery : Master the Linux Command Line in 11.5 Hours'(by Ziyad Yehia)를 수강한 내용을 정리한 글입니다. 틀리거나 부족한 점은 댓글로 달아주시면 감사하겠습니다.


WRITTEN BY

알파카의 Always Awake Devlog

Seoul