
Я использую код ниже
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