我有以下cmd脚本调用cygwin bash脚本:
C:cygwinbinbash -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:TemptestScript>C:cygwinbinbash -l /D/Temp/testScript/shellScript.sh
Hello World!
D:TemptestScript>echo back in cmd.
back in cmd.
D:TemptestScript>exit
如何让cmd退出?
找到问题了- bash太多
我想我发现了这个问题-可能是在我的。bashrc和其他文件我在cygwin登录期间加载的东西。如果我更改主cmd行以删除登录标志),它会像预期的那样工作-一切都关闭。
C:cygwinbinbash /D/Temp/testScript/cygScript.sh
但是我把旗子放回去了:
C:cygwinbinbash -l /D/Temp/testScript/cygScript.sh
并再次运行。我看到输出Hello World!
,它告诉我控制是用bash的,我检查任务管理器。创建4个 bash.exe实例。然后我按下ENTER,看到输出back in cmd.
显示我控制与cmd。现在任务管理器显示三个 bash.exe实例仍然存在。
所以,在我的登录脚本的东西正在创建额外的bash shell。所以不是你的问题,是我的问题。
通过使用cygstart
而不是cmd
来避免在登录脚本中创建持久的子shell
之前我写过问题是太多的bash 。我的.bash_profile
正在做一些事情来创建bash子shell(这些子shell是持久的,因为它们启动的作业一直在后台运行)。这意味着当我的cmd
创建了一个bash
(通过登录)并且第一个bash
退出时,子shell没有退出。
我发现我的部分登录脚本涉及启动一些自动热键脚本,像这样:
cmd /c "$thePath" &
修复是如此简单…使用cygstart
:
cygstart "$thePath"