Bash: devuelve un valor del proceso hijo al padre

Bash: devuelve un valor del proceso hijo al padre

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_countpero 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_county 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

información relacionada