向函数发送 stderr/stdout 消息并捕获退出信号

2023-12-09

我正在处理错误处理并登录我的 bash 脚本。下面我提供了一个简化的代码片段来举例说明用例。

我想在我的脚本中实现以下目标:

  1. 陷阱退出信号应触发下面代码中的 onexit() 函数
  2. stderr 和 stdout 应发送到 log() 函数,该函数将确保根据特定日志格式将输出记录到日志文件(在下面的示例中进行了简化)

以下当前代码存在问题:

  • 步骤 1 没有被 onexit 函数捕获,脚本继续执行步骤 2。很可能是因为 stderr 通过管道传输到 logStd()。如何将错误消息发送到 logStd() 但仍然在 onexit() 中捕获退出信号?

解决:

  1. Add set -o pipefail
  2. 获取退出状态onexit()通过增加local exit_status=${1:-$?}

script.sh(解析后编辑)

#!/bin/bash -E
set -o pipefail

# Perform program exit housekeeping
function onexit {
    local exit_status=${1:-$?}
    log "onexit() called with param: $exit_status"
    exit $1
}

# Simplified log function that sends input parameter to echo. This function is used within this script
# In real case this function would send log statement to log file according to specific log format
function log {
    echo "log(): $1"
}

# Simplified log function that reads input stream and sends to log
# This function is used from commands
function logStd {
    log "logStd() called"
    while IFS= read -r line; do log "$line"; done
}

# http://linuxcommand.org/wss0160.php
# The trap command allows you to execute a command when a signal is received by your script.
# Usage: trap arg signals
# "signals" is a list of signals to intercept and "arg" is a command to execute when one of the signals is received
# arg can either be a command or a function name like clean_up below
trap onexit 1 2 3 15 ERR

# STEP 1 - should fail, send errors to logstd() and be trapped by onexit()
log "**Tarballing should fail, file doesn´t exist"
tar -czf /Users/ismar.slomic/shellscripting/unknownfile.txt.gz /Users/ismar.slomic/shellscripting/unknownfile.txt 2>&1 | logStd

# STEP 2 - should run successfully and send "tar: Removing leading '/' from member names" to logStd()
log "**Tarballing should run successfully"
tar -czf /Users/ismar.slomic/shellscripting/file.txt.gz /Users/ismar.slomic/shellscripting/file.txt 2>&1 | logStd

onexit

output:

log(): **Tarballing should fail, file doesn´t exist
log(): logStd() called
log(): tar: /Users/ismar.slomic/shellscripting/unknownfile.txt: Cannot stat:  No such file or directory
log(): tar: Error exit delayed from previous errors.
log(): **Tarballing should run successfully
log(): logStd() called
log(): tar: Removing leading '/' from member names
log(): onexit() called with param:

你必须使用

set -o pipefail

看到这个相关的 StackOverflow 问题.


最小的例子:

#!/bin/bash

trap handler ERR
handler() { echo trapped ; }

echo 1
false | :

echo 2
set -o pipefail
false | :

Output:

$ bash test.sh
1
2
trapped
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向函数发送 stderr/stdout 消息并捕获退出信号 的相关文章

随机推荐

  • 如何添加图例以使用多个数据帧的数据进行绘图

    我编写了一个从两个单独的数据帧编译的 ggplot 脚本 但就目前情况而言 没有图例 因为颜色不包含在 aes 中 如果可能的话 我希望将两个数据集分开 但不知道如何添加图例 有什么想法吗 我尝试将颜色直接添加到 aes 函数中 但颜色只是
  • 有效语句上出现“SyntaxError:无效语法”

    我在代码中添加了 elif 语句 if i 100 lt 10 letter count numletters str i len str i 1 elif i 100 gt 10 and i 100 lt 20 letter count
  • Joomla 模块可以“知道”它所处的位置吗?

    我对 Joomla 相当陌生 我更喜欢 WordPress 我有一个关于模块位置的问题 模块可以知道它所处的位置吗 例如我可以这样做 if modulePosition left Do this else Do that 这看起来很简单 但
  • 如何将存储为bigint的Java时间戳转换为Presto中的时间戳?

    几天来我一直没有找到这个 如果我的 hive 表中数据的 avro 模式是 type record name messages namespace com company messages fields name timeStamp typ
  • ZF2 表单中的按钮内容

    如何编辑 ZF2 表单的 Button 元素的按钮内容 我可以设置一个标签 但我想在其中插入一些 html 代码 this gt add array type gt Button name gt submit options gt arra
  • 使用 async 时,bcrypt.hash 函数返回 undefined,但与 .then 一起工作正常

    这是异步代码 返回undefined userService register username password gt return bcrypt hash password saltRounds async err hash gt co
  • 在 Windows 窗体中以编程方式添加新的用户控件

    嘿 首先我想指出 我知道这里还有关于这个主题的其他几个问题 我什至以前自己也做过这件事 我在这里问是因为我不知道我的问题是什么 这是我尝试显示新用户控件的代码 private void ValidationLabel Click objec
  • 使用 jQuery 更改下拉列表的选定值

    我有一个包含已知值的下拉列表 我想做的是将下拉列表设置为我知道存在的特定值jQuery 使用常规JavaScript 我会做类似的事情 ddl document getElementById ID of element goes here
  • 我们可以将 Laravel 项目作为库集成到 CodeIgniter 中吗?

    我想通过集成一些用 laravel 编写的代码来增加 CodeIgniter 项目的功能 我该如何接近 我可以通过 CodeIgniter 库包含代码吗 如果是的话怎么办 我只想将控制器和 ORM 包含到 CI 中 Laravel 代码是一
  • R 中 apply 中的 equal() 行为

    这很奇怪 apply matrix c 1 NA 2 3 NA NA 2 4 ncol 2 1 function x identical x 1 x 2 1 FALSE TRUE TRUE FALSE apply data frame a
  • 在这种情况下,iPhone 上的“发布”是什么意思?

    我想问一个关于 iPhone 应用程序的愚蠢问题 我是iPhone应用程序的绿色 我在Apple网站上阅读了以下代码 MyViewController aViewController MyViewController alloc initW
  • 设计模式 - 理解外观模式

    我是设计模式的新手 正在尝试了解它们通常的样子 现在我正在尝试理解外观模式 我觉得外观模式是一个相当广泛的概念 所以我想知道我的第二个图是否会被视为外观模板的一部分 我知道一个典型的外观模式基本上是这样的 A 级是外观 但是如果我们有一个更
  • 密钥不得包含 . pymongo 中的错误

    我试图通过 pymongo 获取 serverStatus 命令的输出 然后将其插入到 mongodb 集合中 这是字典 u metrics u getLastError u wtime u num 0 u totalMillis 0 u
  • PHP Constant() 不适用于名称空间?

    以下不起作用 use application components auditor AuditLevel public function actionAudit data unserialize POST data message data
  • 如何更新由另一个组合框触发的组合框中的值?

    我的表单中有 2 个组合框 我希望在组合框 2 中的列表更新时更改组合框 1 中的选定值 例如 ComboBox1 包含移动公司的名称 ComboBox2 包含该公司的所有手机列表 假设您有一个将手机型号与其制造商关联起来的字典 Dicti
  • 流星:云中

    我正在尝试上传 Lepozepo cloudinary 的照片 这是我的服务器和客户端配置 server Cloudinary config cloud name api key api secret client cloudinary c
  • UIViewController 的背景到分组表视图颜色

    在 UITableView 分组样式中 表格视图的背景有点像浅灰色的纹理颜色 如何获取该值以便将 UIViewController 的整个背景设置为该颜色 如果您正在为 iPhone 和 iPod touch 进 行开发 UIColor定义
  • 搜索文本文件并插入行

    我想要做的是 以下面的文本为例 在文本文件中搜索字符串 Text2 然后在 Text 2 后两行插入一行 插入文本 文本 2 可以位于文本文件中的任何行 但我知道它会在文本文件中出现一次 所以这是原始文件 Text1 Text2 Text3
  • 从存档导出 ipa 时 Xcode 9 崩溃

    我在 Xcode 9 中为任何项目创建了一个存档 然后我尝试创建一个 ipa 文件 开发文件或临时文件 我首先尝试导出存档 然后我选择 开发 或 临时分发 Xcode 9 崩溃 我什至在应用程序的 info plist 中添加了 编译位码
  • 向函数发送 stderr/stdout 消息并捕获退出信号

    我正在处理错误处理并登录我的 bash 脚本 下面我提供了一个简化的代码片段来举例说明用例 我想在我的脚本中实现以下目标 陷阱退出信号应触发下面代码中的 onexit 函数 stderr 和 stdout 应发送到 log 函数 该函数将确