You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash循环创建6个子进程并捕获PID到数组?赋值变量后命令失效

捕获子进程PID到数组的正确脚本写法

你的错误写法cid[$i]=./child2.sh &本质是把赋值操作后台执行,根本没运行child2.sh脚本。下面是正确实现:

基础版本脚本

#!/bin/bash

# 初始化存储PID的空数组
cid=()

# 循环创建6个子进程
for ((i=0; i<6; i++)); do
    # 后台启动子脚本
    ./child2.sh &
    # 用$!捕获最后一个后台进程的PID,存入数组
    cid[$i]=$!
done

# 可选:等待所有子进程执行完毕
wait

# 打印所有捕获到的PID
echo "子进程PID列表:${cid[@]}"

关键说明

  • ./child2.sh &:让子脚本在后台运行,父进程无需等待即可继续执行后续代码
  • $!:Shell内置特殊变量,始终指向最近启动的后台进程PID,正好用来捕获刚启动的子进程ID
  • wait:如果需要父进程等所有子进程跑完再结束,加上这个命令,否则父进程会直接退出,不影响子进程运行

若要将子命令存入变量的写法

如果想把要执行的子命令预先存在变量中,避免重复书写,可这样写:

#!/bin/bash

cid=()
# 定义子进程命令(若有参数,建议用数组存储)
child_script="./child2.sh"

for ((i=0; i<6; i++)); do
    # 执行变量中的命令并后台运行
    $child_script &
    cid[$i]=$!
done

wait
echo "子进程PID列表:${cid[@]}"

如果子命令包含参数或特殊字符,更稳妥的方式是用数组存储命令:

#!/bin/bash

cid=()
# 用数组存储命令及参数,避免解析错误
child_cmd=(./child2.sh "arg with space" --option)

for ((i=0; i<6; i++)); do
    "${child_cmd[@]}" &
    cid[$i]=$!
done

wait
echo "子进程PID列表:${cid[@]}"

内容的提问来源于stack exchange,提问作者Kaleem Khattak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:25:06