셸 스크립트
일련의 명령어를 반복적으로 실행해야 할 때 커맨드라인을 계속 입력하는 것은 비효율적이다.
실행할 명령어를 미리 파일에 넣고 해당 파일을 셸이 실행하도록 할 수 있다.
명령어들로 이루어져 있다.
hello를 만들고
path라는 환경변수에서 명령어를 찾아온다.
hello 만 치면 명령어를 찾을 수 없다고 한다.
./로 경로를 지정하면 찾을 수 있게 된다.
./hello 하면 x 권한이 없어 실행 불가능하다.
chmod +x hello 하면 x권한이 생기고 실행가능하다.
단순히 명령어를 나열하기도 하지만 조건 분기와 반복과 같은 복잡한 제어 구조도 사용할 수 있어 프로그래밍 언어에 가깝다.
장점 :
복잡한 명령어를 직접 입력하지 않아도 된다.
재사용할 수 있다.
다른 사람에게 공유할 수 있다.
오타로 인한 실수를 방지할 수 있다.
셸 스크립트를 셸이 실행한다. 셸마다 스크립트 종류가 다르다.
어떤 셸을 사용하는지에 따라 문법도 달라진다.
sh나 bash용 셸 스크립트를 작성하는 것이 보통이다.
sh는 역사가 길지만 오래되어 기능이 적다.
모든 리눅스에는 sh가 설치되어있기 때문에 호환성과 이식성이 중요한 경우 sh로 작성하는 것이 좋다.
하지만 centos에서는 sh가 bash의 별명으로 사용되고 있다.
sh의 실체가 배포판에 따라 다르고 동작도 다르다. 실제로는 bash인 경우가 많다.
bash 셸 스크립트의 호환성과 이식성이 높다.
sh는 속도가 느리다. bash는 빠르다.
sh는 간단한 계산도 외부 명령어인 expr을 사용한다.
bash는 산술 연산을 지원하여 외부 명령어를 사용하지 않고도 계산할 수 있다.
bash를 선택하는 것이 합리적이다.
du -h ~ | tail -n 1 :
du : 현재 디렉토리에 대해서 summarize disk usage
-h : human readable
tail -n 1 : 마지막 줄만을 보여준다.
홈 디렉터리를 인자로 하면 그 아래의 것들도 다 출력한다.
vi에 homesize.sh 파일을 작성한다.
#! /bin/bash
#!로 시작하는 첫 번째 행을 셔뱅shebang이라고 한다. sharp+bang의 합성어이다.
homesize.sh를 실행하면 명령을 찾을 수 없으므로
./homesize.sh → 허가 거부
chmod +x homesize.sh 후 실행 가능해진다.
./homesize.sh로 실행하면 된다.
./homesize.sh
이때 셸의 실행 명령을 전달받은 리눅스 커널은 먼저 파일의 첫 부분을 확인한다.
#!가 있으면 그 뒤에 적힌 명령어를 실행한다.
#! /bin/bash를 보고 bash 셸을 사용한다는 것을 안다.
셔뱅을 사용하지 않은 셸 스크립트를 source로 실행할 수 있다.
source ./homesize-noshebang.sh : 셔뱅을 사용하지 않은 셸 스크립트 실행
source 명령어로 실행하면 현재 셸에서 실행한다.
파일 이름으로 실행하면 서브 셸bash을 만들고 거기서 실행한다. 리눅스 커널이 확장된다.
셸 스크립트를 실행하는 세 가지 방법
1. 파일 이름으로 실행./homesize.sh서브 셸
2. 셸의 인자로 지정하여 실행bash homesize-noshebang.sh서브 셸
3.source명령어를 사용하여 실행source ./homesize-noshebang.sh현재 셸
source 명령어와 .명령어는 동일하게 동작한다.
source 명령어를 사용하면 현재 셸을 기준으로 파일에 기재된 커맨드 라인이 실행된다 -> 현재 설정된 셸 환경에 영향을 받는다.lsalf를 alias로 만들고 이름으로 실행하면 lsalf 명령어를 찾을 수 없다고 한다.
파일 이름으로 실행하면 서브 셸에서 실행하기 때문에 alias로 만든 것이 적용되지 않는다.
source 로 실행하면 현재 셸에서 실행하기 때문에 잘 실행된다.
서브 셸은 원래 셸과 별개의 셸이기 때문에 환경변수는 사용할 수 있지만, alias를 사용할 수는 없다.
터미널을 끄고 다시 열면 alias가 없어진다. 새로운 셸이 작동하기 때문이다.
alias를 설정하는 sh파일을 ./alias_set.sh로 실행하면 서브 셸에서 alias가 설정되므로 현재 셸에는 적용되지 않는다.일반적으로 파일 이름으로 실행하는 것이 좋다.
셔뱅에 지정한 셸에서 실행되기 때문에 현재 사용자가 사용하는 셸에 영향을 받지 않는다.
source를 사용하면 현재 셸 환경에 따라 실행이 안 될수도 있고 현재 셸의 변수값이나 별명을 바꿀 수 도 있다.
검색 경로란 셸에서 명령어를 실행할 때 명령어의 파일을 찾는 디렉터리를 말한다.
echo $PATH : 검색 경로는 환경변수 PATH에 절대경로로 설정되어 있어 이렇게 확인할 수 있다.
검색 경로에 등록된 디렉터리에 있지 않는 이상 셸 스크립트를 이름만으로 실행할 수 없다.
셸 스크립트를 cat이나 ls처럼 이름만으로 실행할 수 있도록 해보자.
~/bin이라는 디렉토리를 만들고 셸 스크립트를 해당 디렉터리로 옮긴다.
mv homesize.sh ~/bin
vi로 ~/.profile을 열어 PATH="$PATH:~/bin" 을 추가한다.
$PATH에서 검색 경로에 해당하는 디렉터리가 콜론을 구분자로 설정하고 있다.
해당 변수에 ~/bin 을 추가하면 검색 경로에 추가된다.
source ~/. profile : 셸 설정을 현재 셸에 반영하기 위해 source 명령어를 사용한다.
.profile을 수정하고 homesize.sh 라고 입력하면 ~/bin에 있는 셸 스크립트가 실행된다.
전용 디렉터리를 만들고 검색 경로에 추가하면 cat이나 ls처럼 어디서도 이름만으로 실행할 수 있다.
이름만으로 셸 스크립트를 지정하면, 의도치 않게 실행할 수 도 있다.
상대 경로나 절대 경로로 명시적으로 위치를 지정하는 것이 좋다.
shopt -u sourcepath : 검색 경로에서 파일을 찾지 않도록 설정한다.-u : unset 비활성화한다는 의미이다.source homesize.sh : 검색 경로에서 찾지 않으므로 에러 발생한다.