2012-03-08 24 views
3

我正在編寫一個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}') 

回答

4

例如:

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

這假定wc永不失敗,否則你得到wc的退出狀態。

不依賴於這一假設另一種方式:

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

+1非常好的答案。 – 2012-03-08 20:20:14

+0

我非常喜歡第二種方法。 set + o pipefail可以省略,假設在腳本的前面沒有設置pipefail,對吧? – orangejulius 2012-03-08 20:27:06

+0

@ spectre256:是的,我已經添加它只是爲了強調'pipefail'不是必需的。 – Philipp 2012-03-08 20:40:22

1

Eleganter,但仍尷尬:

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

如果你不希望輸出是巨大的,我只是抓住它,然後用它的工作:

output=$(foo) 
returnCode=$? 
lineCount=$(wc -l <<< "$output") 
相關問題