![使用 bash 作为模板工具时如何在第一个错误时失败](https://linux22.com/image/185805/%E4%BD%BF%E7%94%A8%20bash%20%E4%BD%9C%E4%B8%BA%E6%A8%A1%E6%9D%BF%E5%B7%A5%E5%85%B7%E6%97%B6%E5%A6%82%E4%BD%95%E5%9C%A8%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%94%99%E8%AF%AF%E6%97%B6%E5%A4%B1%E8%B4%A5.png)
我正在寻找更好的版本set -e
。那个更好的版本应该可以工作™。我简单地读过Bash常见问题解答/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
答案2
后更多研究erb
与 bash 模板相比,我更喜欢-like 解决方案。如果 bash 有一个快速失败的解决方案,那么它就太奇特了,没有用处(简单、清晰、可维护性……)。
我对简单的快速失败 bash 解决方案的所有尝试都被以下有关规则所否定bash 的简单命令扩展:
如果其中一个扩展包含命令替换,则该命令的退出状态是最后执行的命令替换的退出状态。
TL;DR:忘掉 bash 模板的想法吧,因为它太复杂了,没有什么用处。相反,选择专为该工作设计的高级工具。