退出调用bash的cmd脚本

时间:2015-10-25 01:25:21

标签: windows bash shell cmd cygwin

我有以下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。所以不是你,是我。

1 个答案:

答案 0 :(得分:0)

使用cygstart代替cmd,避免在登录脚本中创建持久性子shell。

之前我写道,问题是太多bashes 。我的.bash_profile正在做一些事情来创建bash子shell(由于他们启动的作业一直在后台运行,因此持久化)。这意味着当我的cmd创建了bash(通过登录)并且第一个bash退出时,子shell就不会退出。

我发现我的部分登录脚本涉及启动一些类似的Autohotkey脚本:

cmd /c "$thePath" &

修复非常简单......只需使用cygstart

cygstart "$thePath"