如果我输入:
progA | progB && progC
然后progC
以progB
为条件,而不是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的代码。
答案 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