#! /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 $?;
}