
Estoy usando el siguiente código
record_count=0
task()
{
while read -r record ; do
record_count=$(( record_count + 1 ))
.....
done < $1
}
for i in {1..5}; do
task $i &
done
¿Cómo puedo usar record_count desde el subshell\proceso secundario hasta el shell\proceso principal? Lo intenté return record_count
pero no funciona. ¿Hay alguna otra forma de devolver los valores (si es posible, devolver más de un valor)?
Respuesta1
"retorno" es para el código de salida, normalmente "0" indica éxito y cualquier otra cosa, error. Y debe ser un número entero menor que 256, por lo que generalmente no es útil para devolver el tipo de resultados esperados aquí.
Pero sus subprocesos pueden producir sus resultados como texto, y el proceso principal puede entonces, opcionalmente, capturar esos resultados:
record_count=0
task()
{
while read -r record
do
record_count=$(( record_count + 1 ))
done <$1
echo $record_count
}
(
for i in {1..5}
do
task $i &
done
wait
) \
| sort
La "espera" asegura que todos los subprocesos hayan finalizado antes de continuar.
Tenga en cuenta que con los procesos paralelos, no hay garantía de en qué orden finalizarán, por lo que los resultados no aparecerán necesariamente en el orden 1, 2, 3, 4, 5.
Si ese orden aleatorio es un problema, el programa podría pasar una "clave" a la tarea, y esa clave podría usarse para ordenar la salida. En este caso, el propio $i podría ser la clave, pero en general los nombres de los archivos no serán números enteros simples.
Respuesta2
Puedes usar return record_count
y obtener el resultado correcto solo si el número está entre 0 y 255. Y debes usar el código de retorno de esta manera:
for i in {1..5}; do
task $i ; echo $?
done