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テンプレートのアイデアを忘れてください。複雑すぎて役に立ちません。代わりに、そのタスクに合わせて特別に設計されたプレミアムツールを選択してください。

関連情報