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

Windows下Git-Bash中$$返回错误PID,如何通过批处理终止Bash脚本?

Git Bash中获取Windows可识别的真实PID以实现跨脚本终止

问题背景

在类Unix系统的Bash环境中,$$可以获取当前Shell的PID,但在Windows的Git Bash中,$$返回的是MinGW子系统内部的PID,并非Windows任务管理器中显示的git-bash.exe或mintty.exe的真实系统PID。这导致通过批处理脚本读取该PID执行taskkill时,会提示进程找不到。

最小复现示例

script.sh:

#!/bin/bash

echo $$ >> /tmp/pid.txt
echo "Saved \"$$\" in PID file. Now going to sleep..."
sleep 86400

运行后写入文件的是子系统内部PID,无法被Windows识别。

对应的kill.bat:

@for /f "tokens=*" %%a in (%TEMP%\pid.txt) do (
    taskkill /pid %%a
)
@del %TEMP%\pid.txt

执行时输出:ERROR: The process "2080" not found.

补充测试:$!同样无法返回正确的Windows系统PID。

解决方法

方案1:获取当前Bash进程的Windows真实PID

修改script.sh,通过Git Bash内置的ps命令提取Windows系统层面的PID:

#!/bin/bash

# 提取当前Bash进程对应的Windows系统PID
WIN_PID=$(ps -ww -p $$ | awk 'NR==2 {print $4}')
echo "$WIN_PID" >> /tmp/pid.txt
echo "Saved Windows PID \"$WIN_PID\" in PID file. Now going to sleep..."
sleep 86400
  • ps -ww -p $$:显示当前Bash进程的详细信息,第4列对应Windows系统的真实PID
  • awk 'NR==2 {print $4}':过滤并提取第二行的目标PID字段

方案2:终止关联的终端窗口进程

如果需要终止整个Git Bash窗口,可直接获取mintty.exe的系统PID:

#!/bin/bash

# 获取当前终端窗口mintty进程的Windows PID
MINTTY_PID=$(ps -ww | grep mintty | grep -v grep | awk '{print $4}')
echo "$MINTTY_PID" >> /tmp/pid.txt
echo "Saved mintty PID \"$MINTTY_PID\" in PID file. Now going to sleep..."
sleep 86400

此方式会直接关闭整个终端窗口,适合无需保留窗口的场景。

批处理脚本验证

原kill.bat无需修改,读取正确的Windows PID后,taskkill即可正常终止目标进程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:35:09