스크립트 안에서 PG_USER 를 바꿨고 echo 로 찍으면 바뀐 값이 보이는데, 실제 쿼리는 계속 예전 계정으로 나간다. 인라인으로 값을 앞에 붙여 실행해도 마찬가지다.
PG_USER=monitor ./pg-ha-monitor.sh --role=master --dry-run
PG_USER="${PG_USER:-postgres}"
이 문법은 "환경변수 PG_USER 가 이미 있으면 그 값을 쓰고, 없을 때만 postgres 로 채운다" 는 뜻이다. 스크립트 안의 값은 기본값일 뿐 우선순위가 가장 낮다.
인라인 지정이 안 먹는다면 현재 셸에 이미 export PG_USER 가 되어 있는 경우다. .bashrc 나 .bash_profile 에 들어 있으면 자식 프로세스가 그 값을 상속받는다.
echo "$PG_USER"
export | grep PG_USER
# declare -x PG_USER="postgres" ← 이게 보이면 인라인이 무시된다
또 하나 짚어 둘 것은 평가 시점이다. :- 는 스크립트 상단의 전역 선언부가 로드되는 순간 즉시 평가된다. parse_opts() 같은 옵션 파서는 그 뒤에 돈다. 그래서 옵션으로 덮어쓰는 방식이 항상 이긴다.
스크립트 로드 → PG_USER="${PG_USER:-postgres}" ← 여기서 확정
...
main "$@" → parse_opts() ← 여기서 덮어쓸 수 있다
| 방법 | 내용 |
|---|---|
| 환경변수를 지우고 실행 | unset PG_USER && PG_USER=monitor ./script.sh |
| 기본값만 바꾸기 | PG_USER="${PG_USER:-monitor}" — 환경변수가 없을 때만 적용 |
| 환경변수를 무시 | PG_USER="monitor" — :- 를 없앤다 |
| 옵션 추가(권장) | --pg-user= 를 parse_opts() 에서 처리 |
옵션을 받는 방식이 가장 확실하다. 파서가 초기화 이후에 돌기 때문에 어떤 환경에서도 반영된다.
heredoc 으로 JSON 을 curl 인라인에 박아 두면 출력해서 재사용하기 어렵다. payload 를 변수로 빼면 큰따옴표 이스케이프 없이 관리되고 그대로 찍어 붙여 넣을 수 있다.
payload=$(printf '{"system":"%s","type":"%s","key":"%s"}' "$SYS" "$TYPE" "$KEY")
printf -- "curl -s -m 5 -X POST -H 'Content-Type: application/json' \\\n -d '%s' \\\n '%s'\n" \
"$payload" "$ALERT_URL"
[ "$DRY_RUN" = "1" ] || curl -s -m 5 -X POST -H 'Content-Type: application/json' -d "$payload" "$ALERT_URL"