linux cli:条件命令依赖于管道链中的原始程序

时间:2011-07-13 15:15:12

标签: command-line pipe

如果我输入:

progA | progB && progC

然后progCprogB为条件,而不是progA。有没有办法将progA的输出管道传输到progB,然后在完成progA之后(如果我必须等待progB完成) ,那不是问题)progC是否以prog A 为条件?

另外,我需要保留管道 - 就像我无法承担progA > file; ....; progB < file并且放松时间效率一样。

编辑:How to use the return code of the first program in a pipe command line是一个类似的问题,但没有保留管道的约束,它还假设我可以访问progB的代码。

2 个答案:

答案 0 :(得分:1)

使用命名管道。

grep的变体设为progA,将cat设为progB

$ 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

请注意,没有作业ID的wait将始终返回0,无论后台作业的退出状态是什么,并且单独命令中的wait %1在作业时不起作用在您开始wait之前退出。我真的不想把它投入生产。所有这些都在bash btw上进行了测试,对于其他炮弹可能略有不同。

答案 1 :(得分:-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