#! /bin/sh -
i=0; while [ "$i" -lt 1000 ]; do
cmdA
cmdB > tempfile || continue
cmdC < tempfile || break
i=$((i + 1))
done
rm -f tempfile
Se você não pode limpar o diretório atual com arquivos temporários, você pode fazer:
#! /bin/sh -
i=0; while [ "$i" -lt 1000 ]; do
cmdA 3>&- 4<&-
tmp=$(mktemp) || exit
exec 3> "$tmp" 4< "$tmp"
rm -f "$tmp"
cmdB >&3 3>&- 4<&- || continue
cmdC <&4 3>&- 4<&- < tempfile || break
i=$((i + 1))
done
exec 3>&- 4<&-
rm -f tempfile
Não importa o que você faça, você precisará armazenar essa saída em algum lugar, pois não poderá obter o status de saída de cmdB até que tenha terminado.
Você pode armazená-lo na memória. Se a saída de cmdB for texto, você poderia fazer:
#! /bin/sh -
i=0; while [ "$i" -lt 1000 ]; do
cmdA
output=$(cmdB > tempfile && echo .) || continue
output=${output%.}
printf %s "$output" | cmdC || break
i=$((i + 1))
done
Se printf não foi criado em /bin/sh (por exemplo, se você instalou mksh ou yash e fez sh ), isso falhará para uma saída maior que 128 KiB.
Ou você pode usar perl :
#! /usr/bin/perl
for ($i = 0; $i < 1000; $i++) {
system "cmdA";
$output = 'cmdB';
next if $?;
open TO_C, "|-", "cmdC" or last;
print TO_C $output;
close TO_C;
last if $?;
}