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

如何获取EOF块内执行的最后一条命令的PID?

解决EOF块内获取后台进程PID的问题

问题原因

核心问题是父shell提前解析变量:当使用bash << EOF时,父shell会先扫描EOF块内的所有变量(比如$!、$pid1)并进行替换,但此时父shell中并没有刚启动的sleep进程的PID,所以这些变量会被替换为空字符串,导致子shell里的变量没有有效值。

解决方法

有两种简单的方式可以避免这个问题,核心都是让子shell自己处理变量展开:

方法1:使用单引号包裹EOF标记

将EOF用单引号括起来,父shell就会跳过对块内所有变量的解析,完全交给子shell处理:

bash <<'EOF'
sleep 10 &
pid1=$!

sleep 10 &
pid2=$!

echo "ID1: $pid1 --- ID2: $pid2"
EOF

方法2:转义块内的$符号

对块内所有$符号添加反斜杠转义,让父shell不提前解析这些变量:

bash << EOF
sleep 10 &
pid1=\$!

sleep 10 &
pid2=\$!

echo "ID1: \$pid1 --- ID2: \$pid2"
EOF

执行以上任意一种写法,都能正确获取到后台sleep进程的PID,输出类似:

ID1: 12345 --- ID2: 12346

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:34:53