我正在编写一个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}')
答案 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