bash - 失败后立即退出并在退出 shell 之前回显错误消息
问题描述
如果命令以非零状态退出并且我想在退出之前回显某事以记录,我有一个脚本应该立即退出:
set -e
command A || (echo "A failed";exit 1)
command B || (echo "B failed";exit 1)
if Condition C;
then
command D || (echo "D failed";exit 1)
它做我想要的。如果它在命令 A/B/D 中失败,向我回显正确的消息并退出。我知道 () 表示子外壳,在子外壳中它回显某些内容然后在子外壳中返回假(退出 1),所以它是“假 ||假”,因此在主外壳中退出。我的问题是,是否与以下内容相同:
#set -e
command A || { echo "A failed";exit 1; }
command B || { echo "B failed";exit 1; }
if Condition C;
then
command D || {echo "D failed";exit 1; }
如果不是,有什么区别?在我的测试中,它们的行为相同。
解决方案
在第二个版本中,exit 1
退出原始外壳,而不是子外壳。这就是为什么您不需要set -e
在发生这种情况时让脚本退出的原因。
你可以像这样得到第一个 shell 的等价物:
set -e
command A || { echo "A failed";false; }
command B || { echo "B failed";false; }
if Condition C;
then
command D || {echo "D failed";false; }
false
以非零状态退出,这将触发set -e
退出 shell。
推荐阅读
- mpi - MPI 点对点通信:消息的顺序
- c - 为什么 C 程序对正整数给出错误的输出?
- pandas - 数据框转换 - Pandas
- python - 我该怎么做才能改进我的 Keras CNN VGG16 模型
- laravel - Laravel 多租户(多模式)因队列而失败
- android - 变量在 successListener 中变为 null
- react-native - React-Native:错误无法安装应用程序。确保您已设置 Android 开发环境
- jquery - 如果条件不同,Ajax 为不同的 url 调用 uri
- javascript - 如何从适用于 Internet Explorer 11 和 Microsoft Edge 的 Typescript 类调用 Javascript 函数?
- c# - 在 C# 中隐藏 ChromeDriver.exe 以及如何将其嵌入可执行文件