我想做类似的事情:
command || log $error_from_last_command
有没有一种方法可以像管道一样使用||
并仍然访问?stderr
command
我的目的是使用处理来自 的错误消息log
,但前提是command
失败。我正在阅读标记的副本,但我不知道如何将其应用于我的情况。
答案1
如果您想在另一个仅在第一个命令完成后运行的程序中使用某个程序的输出,那么将输出存储在文件中可能是最简单的方法。
errfile=$(mktemp)
if ! somecommand 2> "$errfile" ; then
log < "$errfile" # or log "$(cat "$errfile")" ?
fi
rm "$errfile"
通过管道传输输出需要同时运行命令,但我们只有在第一个命令完成时才能获得退出代码。
log < "$errfile"
上面当然会将错误消息定向到标准输入log
(就像使用管道一样)。要将其作为命令行参数,请使用log "$(cat "$errfile")"
(一个参数),或log $(cat "$errfile")
(使用分词,log
看到多个参数),或log "$(< "$errfile")"
(非标准,至少在 Bash 中有效)。
答案2
如果了解以下内容足以满足您的目的退出代码管道的第一个元素(或任何管道的任何元素),您可以利用该bash
变量PIPESTATUS
,根据bash
手册页,该变量是:“一个数组变量......包含来自进程的退出状态值的列表最近执行的前台管道......”。
我意识到从技术上讲,您要求的东西有点不同,但您可能会考虑使用此变量是否可以以您最初没有预料到的方式满足您的需求。