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

使用$!获取后台作业PID的Shell脚本是否存在Bug?

关于Shell脚本中$!获取后台进程PID的疑问

我写了一个Shell脚本,用来启动多个后台作业,并用$!把它们的进程ID(PID)存到数组里,最后打印所有PID。但我怀疑脚本有Bug——如果设备上有其他进程在创建,$!会不会返回其他进程的PID?

我的脚本代码如下:

#!/bin/bash

ps -a & pids+=($!) #$!是否一定会返回ps -a命令的进程ID?
ls -la & pids+=($!) #$!是否一定会返回ls -la命令的进程ID?
echo ${pids[0]}
echo ${pids[1]}

解答

你担心的这个Bug不存在,$!一定会准确返回对应后台命令的PID,原因如下:

  • 在bash中,$!是当前shell会话的内部变量,它只会记录当前shell刚刚启动的最后一个后台作业的PID,和系统中其他无关进程完全没关系。
  • 你的写法命令 & pids+=($!)执行顺序是严格绑定的:先把目标命令放到后台运行,shell会立刻将该进程的PID赋值给$!,紧接着就把$!的值加入数组。这个过程不会被外部进程干扰,因为$!的更新只和当前shell执行的后台命令挂钩。

只有当你在启动后台命令和读取$!之间插入了其他后台命令时,才会出现$!被覆盖的情况,但你的脚本里没有这种场景,所以完全没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:52:03