捕获输出行数并同时返回代码

时间:2012-03-08 19:44:05

标签: bash

我正在编写一个bash脚本,它将调用一个程序(让我们称之为foo)返回一些输出,并给出一个返回代码。我关心程序的返回代码和输出的行数(但不是输出本身)。因为该程序涉及通过互联网检索数据,我宁愿不必两次调用它(特别是,如果两个调用中只有一个因瞬态网络问题或类似情况而失败,这可能会导致问题)。我能想出的最好的脚本来捕获输出行数和返回代码如下。还有更优雅的东西吗?

#!/bin/bash
line=$(foo | wc -l; echo ${PIPESTATUS[0]})
line=$(echo line | tr '\n' ' ')
lineCount=$(echo line | awk '{ print $1}')
returnCode=$(echo line | awk '{ print $2}')

3 个答案:

答案 0 :(得分:4)

例如:

set -o pipefail
lineCount=$(foo | wc -l)
returnCode=$?

这假设wc永不失败,否则您将获得wc的退出状态。

另一种不依赖于这种假设的方式:

set +o pipefail
lineCount=$(foo | wc -l ; exit "${PIPESTATUS[0]}")
returnCode=$?

答案 1 :(得分:1)

Eleganter,但仍然很尴尬:

{ read lineCount; read returnCode; } < <(foo | wc -l; echo ${PIPESTATUS[0]})

如果你不希望输出很大,我只是抓住它然后使用它:

output=$(foo)
returnCode=$?
lineCount=$(wc -l <<< "$output")

答案 2 :(得分:1)

1个班轮(exit $(foo | wc -l))

例如;

$ (exit $(echo "line1\nline2" | wc -l))
$ echo $?
2