2011-07-13 21 views
2

如果I型:linux的CLI:條件命令依賴於原始程序在管鏈

progA | progB && progC 

progC然後是有條件上progB,而不是progA。是否有辦法管道輸出progAprogB,然後,在progA完成後(並且如果我必須等待progB也完成,那就不是問題了)必須以prog爲條件A

此外,我需要保持管道 - 因爲我做不起progA > file; ....; progB < file和鬆散的時間效率。

編輯:How to use the return code of the first program in a pipe command line是一個類似的問題,但沒有保持管道的約束,它也假定我有權訪問progB的代碼。

回答

1

使用命名管道。

隨着grep變化爲progAcatprogB

 
$ cat input 
foo 
bar 
baz 
$ grep fool <input> fifo & cat fifo & wait %1 && echo good || echo bad 
[1] 13876 
[2] 13877 
[1]- Exit 1     grep fool <input> fifo 
bad 
[2]+ Done     cat fifo 
$ grep foo <input> fifo & cat fifo & wait %1 && echo good || echo bad 
[1] 13878 
[2] 13879 
foo 
[1]- Done     grep foo <input> fifo 
good 
[2]+ Done     cat fifo 

注意wait沒有工作的ID將始終返回0無論什麼後臺作業的退出狀態是在一個單獨的那wait %1命令在啓動wait之前退出時不起作用。我不想真的把它投入生產。所有這些都在0123twbtw上進行了測試,可能與其他shell稍有不同。

-1

我不熟悉在普通命令行上執行此操作的方法。但是你可以在shell腳本中做到這一點,以下內容將確保每個以前的程序都成功退出並將輸出傳遞給下一個程序。你會像這樣使用它myscript.sh progA progB progC。如果你不想直接依賴以前的程序成功,你可以使用一個計數器並手動檢查你想要的任何參數順序。

#!/usr/bin/env bash 

OUTPUT="" 

# loop through each argument 
while [ $# -ne 0 ]; do 

    # run each argument as a command and store output 
    OUTPUT=$($1 $OUTPUT) 
    RESULT=$? 

    # check for success 
    if [ "$RESULT" -ne "0" ]; then 
    # do whatever else on error here 
    exit $RESULT 
    fi 

    # next arg 
    shift 
done 
+0

此方法似乎運行程序1和2按順序而不是同時:將其傳遞給PROGB(而不是動態傳遞PROGA輸出到PROGB,因爲它涉及)之前存儲_all_ PROGA輸出的。此外,progA的輸出似乎作爲參數傳遞給progB,這與通過[STDIN](http://en.wikipedia.org/wiki/Standard_streams)傳遞的內容並不完全相同。 –

+0

啊,我不認爲它很重要。這將無法正常工作:( – JohnKlehm