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

我如何使用從子shell\子程序到父shell\進程的record_count。我嘗試過,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

只有當數字在 0 到 255 之間時,您才能使用return record_count並獲得正確的結果。

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

相關內容