Bash를 템플릿 도구로 사용할 때 첫 번째 오류가 발생하면 실패하는 방법

Bash를 템플릿 도구로 사용할 때 첫 번째 오류가 발생하면 실패하는 방법

더 나은 버전을 찾고 있습니다 set -e. 더 나은 버전은 제대로 작동할 것입니다™. 나는 간단히 읽었다배쉬 FAQ/105그리고 시도했다이 미친 접근 방식, 하지만 오류로 인해 실패하는 방법을 아직 모르겠습니다.

내 사용 사례는 다음과 같은 템플릿에서 텍스트 파일을 생성하려는 것입니다.

#!/usr/bin/env bash

# none of these options helped to get the behavior I want: stop on first error
# set -euo pipefail
# shopt -s inherit_errexit
# set -o errexit
# trap ERR

cat <<< "
MYAPP_DATABASE_PASSWORD=$(pwgen -1 32)

MYAPP_USER_PASSWORD=$(pwgen -1 8)

MYAPP_CONFIGURATION_DATE=$(date --utc --iso-8601=ns)
"

또는,이 방법동의할 수도 있습니다( template.txt텍스트 파일 포함).여기에 있는 문자열위에서):

#!/usr/bin/env bash

# none of these options helped to get the behavior I want: stop on first error
# set -euo pipefail
# shopt -s inherit_errexit
# set -o errexit
# trap ERR

while read line; do
    [ -z "$line" ] || echo "# $line"
    cmd="echo $line"
    outline=$(eval $cmd)
    exitstatus=$?
    echo "$outline"
    echo "# exit status was $exitstatus"
done < "template.txt"

pwgen불행하게도 다음 요구 사항으로 인해 위의 접근 방식 중 어느 것도 나에게 적합하지 않습니다. 명령 대체가 실패하면(예: 찾을 수 없음으로 인해) 모든 것이 충돌하기를 원합니다 . 오류가 1개 이상 있어서는 안 됩니다.

다른 기술의 경우 원하는 동작이 기본값입니다.

# this is an erb file                    
<%
require 'securerandom'
require 'date'
%>

MYAPP_DATABASE_PASSWORD=<%= SecureRandom.alphanumeric(32) %>

MYAPP_USER_PASSWORD=<%= SecureRandom.alphanumeric(8) %>

MYAPP_CONFIGURATION_DATE=<%= DateTime.now.new_offset.iso8601(6) %>

철자 오류가 있는 경우 SecureRandom즉시 종료 erb하고 실패합니다.

Bash를 사용하여 이러한 실패 시 충돌 동작을 어떻게 달성할 수 있나요?

답변1

또 다른 옵션은 다음과 같은 구성 도구를 사용하는 것입니다.안시푸르이를 통해 jinja2를 사용할 수 있습니다.주형, 생성된 파일을 사용하는 애플리케이션에 일종의 구성 확인이 있는 경우 생성된 파일을 확인할 수도 있습니다.

- name: Update sshd configuration safely, avoid locking yourself out
  template:
    src: etc/ssh/sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: '0600'
    validate: /usr/sbin/sshd -t -f %s
    backup: yes

답변2

뒤쪽에더 많은 연구erb나는 bash 템플릿보다 -like 솔루션을 선호합니다. Bash에 빠른 실패 방지 솔루션이 있다면 너무 화려해서 유용하지 않을 것입니다(단순성, 명확성, 유지 관리성...).

간단한 빠른 실패 bash 솔루션에 대한 나의 모든 시도는 다음 규칙에 의해 무효화되었습니다.Bash를 위한 간단한 명령 확장:

확장 중 하나에 명령 대체가 포함된 경우 해당 명령의 종료 상태는 마지막으로 실행된 명령 대체의 종료 상태입니다.

핵심요약: bash 템플릿에 대한 아이디어는 잊어버리세요. 너무 복잡해서 유용하지 않습니다. 대신 해당 작업에 맞게 특별히 설계된 프리미엄 도구를 선택하세요.

관련 정보