我有以下cmd脚本调用cygwin bash脚本:
C:\cygwin\bin\bash -l /D/Temp/testScript/cygScript.sh
echo back in cmd.
exit
bash脚本很简单:
#!/bin/bash
echo Hello World!
read
调用部分运行良好 - bash shell登录,按预期回声,按预期读取,控制按预期传回cmd。
但是cmd不会退出。如果我从命令窗口运行它,这很好,但是我将通过双击cmd文件或从RUN等启动它来调用它。
输出我看到了:
D:\Temp\testScript>C:\cygwin\bin\bash -l /D/Temp/testScript/shellScript.sh
Hello World!
D:\Temp\testScript>echo back in cmd.
back in cmd.
D:\Temp\testScript>exit
如何让cmd退出?
我想我发现了这个问题 - 可能是我的.bashrc和我在cygwin登录期间加载的其他文件中的内容。如果我更改主cmd行以删除登录标志),它会按预期工作 - 一切都会关闭。
C:\cygwin\bin\bash /D/Temp/testScript/cygScript.sh
然后我把旗子放回去了:
C:\cygwin\bin\bash -l /D/Temp/testScript/cygScript.sh
然后又跑了。我看到输出Hello World!
,它显示控件是使用bash,我检查任务管理器。 创建了四个 bash.exe实例。然后我按下ENTER并看到输出back in cmd.
显示控件返回cmd。现在,任务管理器向我显示三个 bash.exe实例仍然存在。
因此,我的登录脚本中的某些内容正在创建额外的bash shell。所以不是你,是我。
答案 0 :(得分:0)
使用cygstart
代替cmd
,避免在登录脚本中创建持久性子shell。
之前我写道,问题是太多bashes 。我的.bash_profile
正在做一些事情来创建bash子shell(由于他们启动的作业一直在后台运行,因此持久化)。这意味着当我的cmd
创建了bash
(通过登录)并且第一个bash
退出时,子shell就不会退出。
我发现我的部分登录脚本涉及启动一些类似的Autohotkey脚本:
cmd /c "$thePath" &
修复非常简单......只需使用cygstart
:
cygstart "$thePath"