为了其他人的利益,我将给出与git bash 和msys bash 相关的更一般的答案。
解决方案 1:不使用标准输出进行分离
假设您要分离应用程序:
"C:\Program Files\MyApp\MyApp.exe"
它不会将您想要检索的任何信息输出到标准输出(或标准错误)。
在您的 Windows bash shell 中使用:
cmd //c start //D "C:\\Program Files\\MyApp" MyApp.exe arg1 arg2
MyApp 将在单独的窗口中运行,并且关闭调用 bash shell 不会影响它(基本上就像 Linux 守护程序一样)。
如前所述,您无法阅读应用程序消息,除非它们是对话消息,因此此解决方案适用于 GUI 应用程序。无论如何,如果MyApp.exe 是像MyApp.cmd 这样的Windows 批处理文件,它将调用它的cmd.exe 主机并在那里登录:简而言之,您将读取.cmd/.bat 案例的输出。
类似 Mac 的用户
cmd.exe 窗口会瞬间闪出。如果这对您(r 用户)来说不是很酷,请在上面的行中将 cmd 替换为 cmdow、NirCmd 或类似的东西。
解决方案 2:使用标准输出分离
如果要将日志读取到 stdout 和 stderr,请使用:
cmd //c start cmd //k "C:\\Program Files\\MyApp\\MyApp" arg1 arg2
如果 MyApp 是控制台应用程序,通常建议使用此替代方法。现在你得到一个带有“家”的守护进程。 MyApp 将由第二个 cmd.exe 托管运行,您将在此处看到它的输出。
对于 GUI 应用程序,您会以两个窗口结束:MyApp 窗口和调用 cmd 窗口。
在这两种情况下,退出 MyApp 并不意味着关闭 cmd 窗口;而关闭 cmd 窗口只会关闭 MyApp 控制台。
如果闪烁的一拳打到你,这里你只需要替换第一个cmd,第二个是你的守护进程的可见家。
解决方案 3:分离以文档为中心的应用程序
一些文档与一些处理应用程序密切相关,通过类似于 Linux shebang 语法的机制,但基于 Windows 的注册表;因此您无需调用相关应用程序即可打开文档。
这种行为可以在 bash 中模拟,甚至可以在分离的样式中。
对于不需要输出到stdout和stderr的应用,打开MyApp.doc:
cmd //c start //D "C:\\Program Files\\MyApp" MyApp.exe "Path\\to\\MyApp.doc"
可以简化为:
cmd //c start //D "Path\\to" MyApp.doc
对于需要 stdout 和 stderr 输出的应用,
cmd //c start cmd //k "C:\\Program Files\\MyApp\\MyApp" "Path\\to\\MyApp.doc"
可以简化为:
cmd //c start cmd //k "Path\\to\\MyApp.doc"