Já faz 10 horas desde que eu fiz a pergunta, e eu trabalhei com uma solução ... Nota: Como eu mencionei anteriormente em um comentário (sob a pergunta), wait
não funciona com estes processos. Presumo que seja porque essas 'substituições de processos' não são processos 'filhos', que acredito ser o que wait
espera. (Eu tentei wait
sem args) ....
Os comentários sobre suas características e falhas seriam bem-vindos. Eu não entendo muito bem como stdin é pego por zenity
e tr
quando echo
é o primeiro comando, mas eu pensei em dar uma chance ... Parece funcionar (neste caso ), mas este método é seguro?
É bem provável que existam métodos bem experimentados e testados para lidar com isso, então outras respostas valeriam a pena ....
#!/bin/bash
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# Set up flag-files for processes to send PIDs to main process
# The first thing each process does is: echo -n "$BASHPID " > flag-file
for i in {1..2};do cp /dev/null "$listf".pid$i;done
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
eval locate $zenargs |tee \
>(echo -n "$BASHPID " > "$listf".pid1 ; \
zenity --progress --pulsate --auto-close) \
>(echo -n "$BASHPID " > "$listf".pid2 ; \
tr $'\x60' $X01 \
|sed -n "s/^\(.*\/\)\(.*\)/\n\n/p" \
|while IFS= read -r line ; do \
#
#
# process the data
#
#
done > "$listf" ) \
>/dev/null
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#### WAIT for processes to terminate
pids=$(cat "$listf".pid{1,2})
while [[ "$pids" == *[0-9]* ]] ; do
sleep .1 # GNU
for pid in $pids ; do
if ! kill -0 "$pid" 2>/dev/null; then
pids="${pids/$pid/}"
fi
done
done
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
cat "$listf"
#