변수가 정의되지 않은 경우 envsubst가 실패합니다.

변수가 정의되지 않은 경우 envsubst가 실패합니다.

변수가 많은 파일이 있습니다.

$ cat message.txt
Hello, ${LOCATION}! You too, ${PERSON} ;)

PERSON정의되지 않은 경우 envsubst아무것도 없는 것으로 바꿉니다.

$ LOCATION=World envsubst < message.txt
Hello, World! You too,  ;)

envsubst파일의 많은 환경 변수 중 하나라도 정의되지 않은 경우 0이 아닌 종료 코드(또는 신뢰할 수 있는 코드)로 인해 어떻게 실패할 수 있습니까?

답변1

perl환경 변수가 정의되지 않은 경우 동일한 작업을 쉽게 수행하고 오류와 함께 종료할 수 있습니다.

perl -pe 's{\$(?|\{(\w+)\}|(\w+))}{$ENV{$1} // die "$& not defined\n"}ge'

답변2

envsubst이는 요청의 동작을 변경하지 않으므로 이상적이지는 않지만 설정되지 않은 변수를 식별할 수 있습니다. 사용자는 EOF텍스트에 구분 기호가 나타나지 않는지 확인해야 합니다. 그렇다면 다른 구분 기호를 선택하십시오.

#!/usr/bin/env bash

msg="$( printf 'cat << EOF\n%s\nEOF\n' "$(cat)" )"

bash -u <<< "$msg"

산출:

$ ./test.sh < message.txt || echo fail
bash: line 1: LOCATION: unbound variable
fail
$ LOCATION=World ./test.sh < message.txt || echo fail
bash: line 1: PERSON: unbound variable
fail
$ LOCATION=World PERSON=Ralph ./test.sh < message.txt || echo fail
Hello, World! You too, Ralph ;)

다음은 설정되지 않은 모든 변수를 한 번에 노출하는 대신 한 번에 나열하는 더 긴 버전입니다.

#!/usr/bin/env bash

check_vars() {

# pass a list of variable names on stdin, one to a line

rc=0

while read v
do
        if [[ ! "${!v}" ]]
        then
                printf '%s\n' "$v"
                rc=1
        fi
done

return $rc

}

envsubst -v "$(cat)" | check_vars

이 버전은 설정되지 않은(또는 null) 변수 목록을 한 줄에 하나씩 출력하며 목록이 비어 있는 경우에만 0으로 종료됩니다.

산출:

$ ./test2.sh < message.txt || echo fail
LOCATION
PERSON
fail
$ PERSON=Ralph ./test2.sh < message.txt || echo fail
LOCATION
fail
$ LOCATION=World ./test2.sh < message.txt || echo fail
PERSON
fail
$ LOCATION=World PERSON=Ralph ./test2.sh < message.txt || echo fail
$

관련 정보