Bash 如何继续重新启动Windows cmd提示符

Bash 如何继续重新启动Windows cmd提示符,bash,cmd,cygwin,bash-trap,Bash,Cmd,Cygwin,Bash Trap,Cygwin的bash通常比Windows的cmd命令shell更可取,因此我们在生成Windows shell之前使用它来设置环境。但是,使用Ctrl-Ckills停止在此生成的shell中运行进程的执行将引导用户返回bash shell 我尝试的解决方法: source setupEnvironment.sh restartCommand() { # Reset trap trap restartCommand SIGINT echo -e " === Restarting w

Cygwin的bash通常比Windows的cmd命令shell更可取,因此我们在生成Windows shell之前使用它来设置环境。但是,使用Ctrl-Ckills停止在此生成的shell中运行进程的执行将引导用户返回bash shell

我尝试的解决方法:

source setupEnvironment.sh

restartCommand() {
  # Reset trap
  trap restartCommand SIGINT
  echo -e " === Restarting windows cmd prompt\n"
  cmd /k 
}

trap restartCommand SIGINT
echo -e " === Starting windows cmd prompt\n"
cmd /k

这种方法只重新启动cmd一次。未捕获后续的Ctrl-C。有没有办法继续重新启动cmd进程?

后续的Ctrl-Cs不会被捕获,因为脚本将在到达末尾时退出

当您按住ctrl-c键时,cmd很可能会返回错误,在这种情况下,您可以这样做

until cmd /k; do true; done
否则,使脚本循环,直到未按下ctrl-c:

trap restart=1 SIGINT
echo -e " === Starting windows cmd prompt\n"
restart=1
while (( restart )); do restart=0; cmd /k; done

它必须在同一个窗口吗?如果不是的话,我的运气要好得多

cygstart cmd
cmd
在其自己的窗口中启动;只有退出才能关闭该窗口,并解释为什么在自己的控制台窗口中打开
cmd.exe
是最好的方法,作为补充:

  • 虽然您可以尝试解决Ctrl-C问题,如中所示,但其行为与常规
    cmd.exe
    控制台窗口中的行为并不完全相同:因为每次按下Ctrl-C时都会创建
    cmd.exe
    的新实例,所以以前的状态将丢失

  • Cygwin终端(控制台窗口)使用UTF-8字符编码,而不是基于(传统)OEM代码页的常规控制台窗口编码,两者不兼容

  • 奇怪的是,停留在Cygwin终端会导致
    cmd.exe
    回显所有交互提交的命令(就像在批处理文件中没有
    @echo off

要在启动
cmd.exe
控制台窗口时自动关闭Cygwin窗口,请使用

exec cygstart cmd

很好奇为什么你不能在bash中完成所有事情,为什么你需要启动cmd?@可怜的变量:就个人而言,我很高兴留在bash。但是其他工作人员需要cmd提示符。所以我妥协了:我将调用cmd,但只有在bash中设置好环境之后(bash做得更好!)。谢谢-这两个答案都相当好,可能是我所希望的最好的答案。当CMD处于编译过程中时,CTRL C仍然频繁地返回到BASH。此外,cmd窗口有时会被锁定,可能只有在任务管理器的结束进程时才会关闭。这是一个不错的解决方法。额外的窗口并不理想,但一切都按预期进行。cygstart选项
--wait
在这里可能很有用。我试过了,但过程在后台进行,用户不知道。只是一个额外的进程和几MB的RAM,但当你很少重新启动电脑时,这可能会增加。哪个进程?猛击?
bash
是如何启动的?另一种选择是,bash进程在使用cygstart启动cmd后退出(不带--wait)。顺便说一句,即使在没有cygstart的情况下启动cmd,bash进程也会停留在memoryhoops中,我的最后一条评论提到了
--hide
。这关闭了窗口,但父进程保持活动状态。尝试
--等待
似乎也没有什么用处。是的,目前最好的解决方案是
cygstart cmd/K;退出
。我没有说的是,这个bash提示符实际上是从一个cmd提示符启动的——因此bash提示符实际上夹在两个cmd提示符之间,用户不知道。因此,退出bash不会退出原始cmd提示符。