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系统的真实PIDawk '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
相关产品推荐
相关产品推荐

