[RHEL 공통] set 명령어 이용
본문 바로가기
IT 이야기/Linux 명령어

[RHEL 공통] set 명령어 이용

by 찬찬이 아빠 2021. 2. 19.
반응형

set 명령어는 다양한 기능을 가지고 있지만 기능별로 서로 연관성이 별로 없어서 혼동하기 쉽습니다. set 명령어 기능을 크게 나누면 다음 세 종류입니다.

 

1. 셸 변수 표시하기

2. 셸 옵션 설정하기

3. 위치 파라미터($1, $2 등) 조작하기

 

  1. 셸 변수 표시하기

아래와 같이 set 명령어를 인수 없이 실행하면 환경 변수를 포함한 현재 정의된 변수 목록을 표시합니다. set 명령은 현재 셸 변수 상태를 확인할 때 편리합니다.

$ set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH+SOURCE=()
... 생략 ...

 

 

  2. 셸 옵션 설정하기

set 명령어로 옵션을 설정하면 셸의 다양한 동작 모드를 지정할 수 있습니다.

변수가 정의되지 않으면 에러를 발생시키는 -u 옵션과 종료 스테이터스가 0이 아니면 종료하는 -e 옵션이 있습니다.

 

다음은 set 옵션 중 일부를 정리해보았습니다.

옵션 의미
-u 정의 안된 변수를 참조하면 에러 발생
-e 명령어 실패(종료 스테이터스가 0이 아님)하면 즉시 스크립트 종료
-n 명령어를 해석만 하고 실행하지 않음. 문법 확인 시 사용
-f 경로명 확장을 무효화. 예를 들어 *를 확장하지 않고 그대로 *라는 문자로 취급
-x 명령어를 확장한 결과 표시. 디버그할 때 사용
-C 리다이렉트할 때 기존 파일을 덮어쓰지 않음

 

또한 -o <옵션명>으로 옵션을 설정할 수 있습니다. 예를 들어 다음은 -f 옵션 설정을 -o로 작성한 것입니다.

# set -f와 같음
set -o noglob

 

 

  3. 위치 파라미터 조작하기

위치 파라미터($1, $2, ...)는 명령행 인수가 대입되는데 set 명령어로 그 값을 재설정할 수 있습니다. 아래는 set 명령어로 위치 파라미터를 설정한 예제입니다. 이때 set 명령어 인수 "Kim", "Lee", ... 이 그대로 위치 파라미터($1, $2, ...)가 됩니다. 따라서 명령행 인수에 무엇을 지정해도 $2인 "Lee"이 출력됩니다.

#!/bin/sh

set "Kim" "Lee" "Park"
echo $2

 

그런데 위치 파라미터를 조작할 때 최초의 인수가 하이픈으로 시작하는 문자열이면 옵션으로 인식하게 됩니다. 아래는 단순히 문자열로 "-all"을 다루고 싶은 경우라고 가정합니다.

#!/bin/sh

set "-all" "Kim" "Lee" "Park"
echo $2

 

하지만 위의 스크립트를 실행하면 다음처럼 첫"-all"을 옵션으로 인식하고 에러가 발생합니다.

$ ./test2.sh
./test2.sh: line 3: set: -l: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option] [arg ...]

 

이를 방지하기 위해 아래 처럼 -- 뒤에 인수를 지정합니다.

#!/bin/sh

set -- "-all" "Kim" "Lee" "Park"
echo $2

 

위의 설정 처럼 set 명령어 뒤에 --이 있으면 그 뒤에 오는 문자열은 옵션이 아니라느느 뜻이 됩니다. 따라서 "-all"도 단순한 문자열로 다루게 됩니다.

 

응용으로 아래처럼 set --로 --만 지정하고 인수를 아무것도 적지 않으면 위치 파라미터를 모두 초기화하게 됩니다. 결과로 아무것도 표시되지 않습니다.

#!/bin.sh

set --
echo $2
반응형

댓글