【问题标题】:Exit from cmd script that calls bash退出调用 bash 的 cmd 脚本
【发布时间】:2015-10-25 01:25:21
【问题描述】:

我有以下调用 cygwin bash 脚本的 cmd 脚本:

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 退出?

发现问题 - bash 太多

我想我发现了问题 - 可能在我的 .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。所以不是你,是我。

【问题讨论】:

  • 您希望 cygwin 终端在您运行命令后关闭 - 通过双击文件?
  • 不,不是这样。我编辑了我的问题以提供更多信息。 bash shell 正在做它的事情并退出。控制将返回到 cmd 脚本并且退出。 exit 命令没有达到我的预期(关闭 cmd 窗口)。
  • 为什么这被否决了?如果我可以做些什么来改进它,请告诉我。请不要在没有反馈的情况下投反对票。
  • 所以“cmd 脚本”或“cmd 文件”是指带有.bat.cmd 扩展名的文件,您通过双击或“运行...”运行它? ?
  • 请不要edit您的问题包含答案。你应该写一个单独的答案 - Can I answer my own question?

标签: windows bash shell cmd cygwin


【解决方案1】:

通过使用cygstart 而不是cmd,避免在登录脚本中创建持久子shell。

之前我写过问题是太多的 bash。我的.bash_profile 正在做一些事情来创建 bash 子外壳(因为它们启动的作业一直在后台运行,所以它们是持久的)。这意味着当我的cmd 创建一个bash(通过登录)并且第一个bash 退出时,子shell 没有退出。

我发现我的部分登录脚本涉及启动一些 Autohotkey 脚本,如下所示:

cmd /c "$thePath" &

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

cygstart "$thePath"

【讨论】:

    最近更新 更多