더북(TheBook)

초보 시스템 관리자의 일기 | 시스템 관리자의 단짝 친구 셸 스크립트

명색이 시스템 관리자라면 리눅스 명령어를 자유자재로 구사할 줄 알아야 한다. 아직 경지에 이르지는 못했지만 한편으로는 영어 단어 암기하는 거랑 비슷하다고 본다. 단순히 책만 보면서 머리로 이해하기보다 실제 명령어를 활용해봄으로서 사용 방법을 체득하는 노력이 필요할 것이다.

(아직 제대로 익히지도 못했으면서) 이 장에서 배운 몇몇 명령어를 가지고 쉴 새 없이 맞닥뜨리는 문제를 해결하기란 한계가 있기 마련이다. 그때그때 필요한 명령을 하나씩 입력하는 대신 여러 명령을 조합해서 정해진 순서대로 자동 실행할 수 있다면 내가 없어도 시스템이 스스로 복잡한 작업을 처리할 수 있겠지. 단순하고 반복적인, 지긋지긋한(!) 시스템 관리자의 업무를 자동화시킬 수 있다는 말이다.

선배에게 피 같은 게임 아이템을 갖다 바치고 알게 된 이 환상적인 프로그램을 셸 스크립트라고 한다. 쉽게 말해 실행할 명령어들을 나열해 놓은 파일이라고 생각하면 되는데, 셸 스크립트를 어떻게 활용하느냐에 따라 얻을 수 있는 효과는 무궁무진하다.

셸은 사용자가 커맨드라인에서 입력한 명령을 해석해서 운영체제의 핵심인 커널에 전달하는 도구다. 커맨드라인에서 ls -al이라는 명령을 내리면 셸이 ls-al로 나누고 ls는 명령어, -al은 옵션으로 분석한 다음 리눅스 커널에 전달하며 처리 결과를 화면에 보여준다. 이런 이유로 셸을 명령어 해석기라고도 한다.

우분투를 비롯한 대부분의 리눅스가 배시 셸Bourne Again SHell, BASH을 사용한다. 명령 프롬프트에서 bash라고 입력하면 배시의 버전 정보를 확인할 수 있다. 내가 셸 스크립트를 작성하면 바로 이 배시 셸이 셸 스크립트에 입력된 명령을 자동으로 실행할 것이다 (근본적으로 ‘스크립트’라는 용어가 한 줄씩 읽어 와서 실행하도록 작성된 프로그램을 의미한다).

shinjaehun@losttemple:~$ bash --version
bash --version
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

먼저 vi로 첫 번째 셸 스크립트를 작성해보자.

shinjaehun@losttemple:~$ vi helloworld

모든 배시 셸 스크립트는 다음과 같이 #!/bin/bash로 시작해야 한다. echo 문자열을 출력하는 명령으로 “Hello! Shell Script!”를 커맨드라인에 보여줄 것이다. 파일을 저장하고 편집기를 빠져나온다.

#!/bin/bash
echo “Hello! Shell Script!”

다음으로 스크립트 파일에 실행 권한을 부여한다. 실행 권한(+x)을 부여했다.

shinjaehun@losttemple:~$ ls -l helloworld
-rw-rw-r-- 1 shinjaehun shinjaehun 44 10월 20 09:10 helloworld
shinjaehun@losttemple:~$ sudo chmod +x helloworld
shinjaehun@losttemple:~$ ls -l helloworld
-rwxr-xr-x 1 shinjaehun shinjaehun 44 10월 20 09:10 helloworld

helloworld 스크립트를 실행시키려면 디렉터리 경로를 명시해야 한다. 현재 작업 디렉터리를 의미하는 ‘./’를 붙여서 스크립트를 실행하면 결과가 정상적으로 출력된다.

shinjaehun@losttemple:~$ ./helloworld
Hello! Shell Script!

어디에서든지 셸 스크립트를 실행하려면 적절한 디렉터리로 스크립트를 옮겨야 한다. 셸은 환경 변수 PATH로 지정된 경로를 차례로 탐색해서 명령을 실행하며, echo 명령으로 현재 시스템에 설정된 환경 변수 PATH의 값을 확인할 수 있다.

shinjaehun@losttemple:~$ echo $PATH
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/
local/games

사용자가 작성한 스크립트는 일반적으로 /usr/local/bin에 저장한다. /usr/local/bin은 소유권이 루트에게 있으므로 helloworld를 옮길 때 sudo가 필요하다.

shinjaehun@losttemple:~$ sudo cp helloworld /usr/local/bin/
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.