WAS Engineer - Linux 8번째

이정빈·2022년 9월 27일
0

리눅스 복습

목록 보기
8/11
post-thumbnail

셸 함수

셸 스크립트를 작성하다 보면 똑같은 처리를 여러 곳에서 중복하여 입력하는 경우가 생긴다. 이 때 중복되는 처리를 함수로 정의해 놓으면 코드가 훨씬 깔끔해진다.

셸 함수는 다음과 같이 function이라는 키워드를 사용하여 정의한다. function 뒤에 함수 이름을 쓰고 처리할 코드를 { } 안에 기술합니다.

  • 셸 함수 정의
function <함수 이름> ()
{
	처리
}

function이나 () 중 하나는 생략할 수 있다.
코드에서 셸 함수는 반드시 호출하기 전에 정의해야 한다.

  1. 셸 함수 안에서의 위치 파라미터

셸 함수 안에서도 위치 파라미터 $1, $...를 사용할 수 있다. 이 때 위치 파라미터에는 커맨드 라인의 인자가 아니라 함수의 인자 값이 대입된다.

  1. 셸 함수의 종료 상태

셸 함수도 종료 상태를 반환하다. 보통 셸 함수 안에서 마지막으로 실행한 명령어의 종료 상태가 셸 함수의 종료 상태가 된다.

명시적으로 종료 상태의 값을 반환하려면 return 명령어를 사용해야 한다.

  • 셸 함수 종료 및 상태 반환
return <종료 상태>

셸 함수 안에서 return 명령어가 실행되면 셸 함수의 처리가 종료되고 호출한 곳으로 실행 흐름이 돌아간다.

셸 스크립트 활용하기

셸 스크립트는 기존 명령어를 조합하여 새로운 명령어를 만들 수 있다는 큰 장점으로 다양하게 활용할 수 있다.

  1. 셸 스크립트의 결점

셸 스크립트에는 단점도 있다. 다음과 같은 상황에서는 셸 스크립트 사용을 재고해보아야한다.

대규모 시스템

셸 스크립트에서는 변수 타입이 없으며, 객체 지향 프로그래밍이 불가능해서 여러 명이 참여하는 대규모 개발에는 적합하지 않다. 또한, 셸 스크립트를 위한 통합 개발 환경(IDE)의 지원도 부족한 편이다. 따라서 셸 스크립트는 대규모 시스템에 적합하지 않다.

고성능이 필요한 처리

셸 스크립트는 기본적으로 한 행씩 명령어를 실행한다. 즉, 자식 프로세스를 생성하는 처리(fork)가 동반된다. 따라서 다른 스크립트 언어에 비해 속도가 느린 편이다.

아카이브와 압축

수많은 파일을 메일로 보내거나 백업할 때는 여러 파일을 하나로 모오는 것이 좋다. 이처럼 여러 개의 파일이나 디렉터리를 모아서 파일 하나로 만드는 것을 아카이브라고 한다.

아카이브 파일을 압축하여 전송과 보관 비용을 줄인다. 윈도우와 macOS에서 자주 사용하는 zip은 아카이브와 압축을 동시에 실행한다. 리눅스에서는 아카이브와 압축을 구분하여 다루며, 아카이브할 때는 tar, 압출할 때는 gzip과 bzip2를 사용한다.

tar 명령어 : 파일 아카이브하기

tar는 아카이브를 위한 명령어이다. 복수의 파일이나 디렉터리를 아카이브 파일 하나로 모으거나 반대로 복원하기 위해 사용한다.

tar는 무척 오랜 역사를 가진 명령어로 현재에도 널리 사용되고 있다. 옵션을 지정하는 방법은 조금 주의를 기울여 익힐 필요가 있다.

tar 아카이브 파일을 만들 때는 확장자로 .tar를 붙인다.

  • tar 로 아카이브하기

tar cf <아카이브 파일 이름> <아카이브로 묶을 파일 경로>

여기서 c는 create를 의미하며 새로운 아카이브 파일을 만드는 것을 의미한다.

f는 file을 의미하며 f <아카이브 파일 이름> 같이 새롭게 만들 아카이브 파일의 이름을 지정할 때 사용한다. tar 명령어를 사용할 때 파일을 지정하려면 언제나 f 옵션을 사용해야 한다.

아카이브 파일의 내용 확인하기

아카이브 파일의 내용을 확인하려면 t 옵션을 사용해야 한다. 여기서 t는 list의 t이다.

  • 아카이브 파일의 내용 확인

tar tf <아카이브 파일>

t 옵션을 지정하면 아카이브 파일 안에 포함된 파일 목록이 출력된다. c로 아카이브 파일을 만들고 t로 확인한다고 외우는 게 좋다.

아카이브 해제하기

아카이브 파일에 묶인 파일과 디렉터리를 원래대로 복원하려면 x 옵션을 사용해야 한다.

  • 아카이브 복원

tar xf <아카이브 파일>

여기서의 x는 extract의 x이다.

아카이브가 해제되는 곳에 동일한 이름의 파일이 있으면 덮어쓰므로 반드시 미리 확인해야 한다.

파일 목록을 출력하는 v 옵션

tar 명령어를 사용할 때 v 옵션을 추가하면 대상 파일의 목록이 출력된다.

그리고 t 옵션으로 아카이브 파일의 내용을 확인할 때 v 옵션을 추가하면 파일 이름 뿐만 아니라 권한이나 소유자 등의 상세 정보도 함께 출력할 수 있다.

파일 속성 유지하기

tar는 파일의 권한, 소유자, 타임스탬프 같은 파일의 속성을 유지한 채로 아카이브한다. 따라서 단순히 cp로 파일을 복사하는 것보다 백업에 적합하다.

하지만 일반 사용자로 tar를 실행한다면 권한 부족으로 파일의 속성을 유지하지 못할 수 있다. 예를 들어 소유자가 root이고 소유자에게만 읽기 권한이 부여된 파일에 대해서는 일반 사용자가 아카이브할 수 없으며 그러한 파일이 포함된 아카이브를 복원하면 속성이 올바로 복원되지 않을 수 있다.

따라서 디렉터리를 온전히 백업하기 위해서는 슈퍼 사용자 권한으로 tar를 실행해야 한다.

gzip 명령어 : 파일 압축하기

gzip은 파일의 압축과 해제를 위해 사용하는 명령어이다. gzip으로 압축할 때는 보통 .gz라는 확장자를 붙인다. 요즘에는 gzip보다 압축률이 더 좋은 파일 형식도 나왔지만, gzip이 빠르면서도 호환성이 좋아 아직도 많이 사용한다.

  • 파일 압축

gzip <압축할 파일>

압축한 파일을 복원하려면 -d 옵션을 지정한다.
gunzip 명령어를 사용해도 압축을 해제할 수 있다.

  1. 표준 출력에 gzip 파일 출력하기

gzip의 -c 옵션을 사용하면 압축 결과를 바이너리 형태로 표준 출력에 출력할 수 있다. 그리고 표준 출력을 리다이렉션하면 임의의 이름으로 압축 파일을 만들 수 있다.

  • 임의의 이름으로 압축 파일 생성
$ gzip -c ps.txt > ps_test.txt.gz
$ ls
ps.txt ...생략 ... ps_test.txt.gz
...생략...

-c 옵션을 지정하면 바이너리 데이터가 출력되므로 직접 터미널에 출력하기보다는 파이프나 리다이렉션 용도로 사용한다.

  1. tar와 gzip 조합하기

gzip 명령어는 아카이브 기능이 없으며 파일 하나만 압축할 수 있다. 따라서 파일 여러 개를 묶어서 압축하려면 tar로 아카이브한 뒤에 gzip을 사용해야 한다.

이렇게 tar로 아카이브하고 gzip으로 압축한 파일에는 tar.gz나 .tzg라는 확장자가 붙는다.

최근 tar 명령어에는 gzip의 압축 기능을 포함하고 있어서 gzip을 사용하지 않고도 tar만으로도 tar+gz 파일을 만들 수 있다. tar 명령어로 아카이브할 때 c 옵션과 함께 z 옵션을 추가하면 압축까지 수행한다.

  • tar 명령어로 tar + gz 형식으로 파일 작성
$ tar czf dir1.tar.gz dir1

그리고 tar+gz 파일을 복원하려면 다음과 같이 x옵션과 함께 z옵션을 지정해야 한다.

  • tar 명령어로 tar + gz 형식의 파일 복원
$ tar xzf dir1.tar.gz

이처럼 tar 명령어를 사용할 때 z 옵션을 사용하면 tar+gz 형식으로 압축과 아카이브를 함께 수행할 수 있다.

파이프와 리다이렉션으로 tar + gz 파일 작성하기

예전에는 tar 명령어에 gzip의 압축 기능이 포함되어 있지 않았다. 그래서 tar + gz파일을 만들려면 tar 명령어와 gzip 명령어를 잘 조합해서 사용해야 했다.

  • tar 명령어와 gzip 명령을 조합하여 tar + gz 파일 생성
$ tar cf -dir1 | gzip -c > dir1.tar.gz

먼저 tar을 실행할 때 cf에 이어 하이픈을 지정하면 아카이브 파일이 표준 출력으로 출력된다. 그리고 gzip은 파일을 지정하지 않으면 표준 입력을 읽는다.

또한, 위 예에서는 gzip 명령어에 -c 옵션을 지정하여 dir1.tar.gz로 리다이렉션하고 있다. 이로써 최종적으로 dir1.tar.gz라는 tar+gz 형식의 압축 파일이 만들어진다.

bzip2 명령어 : 파일 압축하기

bzip은 gzip과 마찬가지로 파일을 압축하고 해제하는 명령어이다. bzip2는 gizp보다 압축률이 높아 데이터를 더 작게 만들 수 있다. 하지만 압축과 해제하는데 걸리는 시간이 gzip보다 더 오래 걸린다.

bzip2는 gzip과 동일한 옵션으로 동작하도록 설계되었다. 따라서 gzip의 사용법을 안다면 bzip2도 어렵지 않게 사용할 수 있다.

  • bzip2로 파일 압축
bzip2 <압축할 파일>
  • bzip2로 압축 수행
$ bzip2 ps.txt
$ ls -l
합계 4
-rw-rw-r-- 1 ldk ldk 3420 526 23:48 ps.txt.bz2

bzip2로 압축한 파일에는 bz2라는 확장자가 붙는다.
압축한 파일을 복원하려면 gzip과 동일하게 d 옵션을 사용한다.
bunzip2라는 명령어를 사용해도 압축을 해제할 수 있다.

  1. tar와 bzip2 조합하기

최근에는 tar 명령어에 bzip2 형식의 압축 기능도 포함되었다. tar로 bzip2를 사용하려면 j 옵션을 사용해야 한다.

  • tar + bz2 형식의 압축 파일 생성
$ tar cfj dir1.tar.bz2 dir1

tar에서 gzip을 사용할 때 z라는 옵션을 사용했는데 이를 j로 바꾸면 된다.

  1. 그 외 압축 형식

bz2보다 더 압축률이 좋은 형식으로 xz가 있다.
xz도 gzip과 동일한 방식으로 옵션을 지정하여 사용한다. 또한, tar 명령어에서 xz형식을 사용할 때는 J 옵션을 사용한다.

  • tar + xz형식으로 압축
$ tar cJf dir1.tar.xz dir1

xz압축 형식을 사용하면 압축하는데 시간이 무척 오래 걸린다. 하지만 압축률은 bz2보다 좋기 때문에 높은 압축률이 필요한 상황에 적합하다.

zip 명령어 : 파일 아카이브와 압축하기

zip은 tar이나 gzip과 달리 아카이브와 압축을 동시에 수행하는 명령어이다. 여러 파일과 디렉터리를 파일 하나로 압축할 수 있다. 확장자로는 zip이 붙는다.

zip은 리눅스에서는 별로 사용되지 않지만 윈도안 macOS에서 많이 사용되고 있어 리눅스에서도 다루는 방법을 알아 두는 것이 좋다.

리눅에서 zip 파일을 다루려면 zip 명령어와 unzip 명령어를 설치해야 한다. 이들 명령어는 대부분의 배포판에서 표준으로 설치되어 있지 않으니 다음과 같이 별도로 설치해야 한다.

  • zip, unzip 패키지 설치(CentOS)
# yum install zip unzip

Is this ok [y/d/N] : y
  • zip, unzip 패키지 설치(우분투)
$ sudo apt-get install zip unzip
  1. zip 파일 작성하기

zip 명령어로 파일이나 디렉터를 압축하는 방법은 다음과 같다.

  • zip 파일 작성
zip -r <압축 결과의 파일 이름><압축 대상의 경로>

-r 옵션은 지정한 디렉터리 아래의 모든 파일을 포함하는 옵션이다.
압축된 zip 파일을 확인하려면 zipinfo라는 명령어를 사용한다.
압축한 파일을 복원하려면 unzip 명령어를 사용해야 한다.

zip 명령어의 경우 압축을 수행할 때 대상이 되는 파일 이름이 기본으로 출력된다. 파일 개수가 많아 파일 이름을 출력하지 않을 때는 -q 옵션을 지정하면 된다.

  • 대상 파일 이름을 출력하지 않으면서 zip 파일 작성
$ zip -rq dir1.zip dir1

마찬가지로 unzip 명령어를 사용할 때도 -q 옵션을 지정하면 파일 이름이 출력되지 않는다.

  • 대상 파일 이름을 출력하지 않고 unzip 수행
$ unzip -q dir1.zip
  1. zip 파일에 암호 설정하기

zip 파일을 만들 때는 암호를 설정할 수 있다. zip 파일에 암호를 설정하면 암호를 입력해야 복원할 수 있다.

암호를 지정하여 zip 파일을 만들려면 -e 옵션을 지정해야 한다.

profile
WAS Engineer, Cloud Engineer(지망)

0개의 댓글