2011-07-13 20 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