Bash-从子进程返回一个值到父进程

Bash-从子进程返回一个值到父进程

我正在使用下面的代码

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

我如何使用 record_count 从子 shell\child 进程到父 shell\process。我试过,return record_count但没有用。有没有其他方法可以返回值(如果可能的话,返回多个值)

答案1

“return” 表示退出代码,通常为“0”表示成功,其他表示失败。它必须是小于 256 的整数,因此通常它对于返回此处预期的结果类型没有用。

但是您的子流程可以将其结果生成为文本,然后主流程可以选择捕获这些结果:

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

“等待”确保所有子进程都已完成,然后再继续。

请注意,对于并行进程,无法保证它们以什么顺序完成,因此结果不一定会按照 1、2、3、4、5 的顺序出现。

如果这种随机顺序有问题,程序可以向任务传递一个“键”,然后可以使用该键对输出进行排序。在这种情况下,$i 本身可以作为键,但通常文件的名称不会是简单的整数。

答案2

return record_count只有当数字介于 0 到 255 之间时,您才能使用并获得正确的结果。并且您应该以这种方式使用返回代码:

for i in {1..5}; do
task $i ; echo $?
done

相关内容