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 из subshell\child process в parent 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

Связанный контент