创建批处理文件以启动cygwin并执行特定命令



我想创建一个启动cygwin并执行特定命令的批处理文件(该命令是读取bash文件并在其中执行某些命令)。

这是我开发的批处理文件,它在某种程度上有效。 Cygwin终端打开并尝试读取bash文件,但无法执行其中的命令:

@ECHO OFF
C:cygwin64binmintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)
PAUSE

我怎样才能做到这一点?

从批处理文件中,启动 Cygwin 的 bash shell 并使用登录标志。 这为通过.bash_profile.bashrc文件设置路径和环境变量奠定了基础。我相信这可能是你困难的根源。

@ echo off
C:cygwin64binbash --login -c "cd ~/path/to/desired; ./mybashfile.sh"

如果您提供有关 bash 文件性质的更多详细信息,我可以更具体。 祝你好运。

Patrick Kelly的有用回答指出,在Cygwin中bash作为登录shell运行可能是问题的根源。

事实上:始终将 Cygwinbash作为登录shell 运行,因为否则不会进行关键的初始化;值得注意的是,$PATH变量不会包含/usr/local/bin:/usr/bin,并且语言环境设置不正确。

为了使bash启动登录shell,必须向bash 可执行文件传递-l选项(或其更长的别名,--login)。

  • 要执行脚本,请执行以下操作:

    • 当前控制台窗口中,查看 Patrick 的答案。

      • 请注意,除非目标脚本依赖于特定的工作目录,否则将-c与单独的cd和执行命令一起使用并不是绝对必要的;如下所示就可以了:

        C:cygwin64binbash -l c:pathtoyourscript
        
    • mintty.exe,Cygwin附带的终端应用程序(正如您尝试过的那样):

      C:cygwin64binmintty /bin/bash -l c:pathtoyourscript
      
      • 请注意,从命令提示符或批处理文件执行mintty总是会打开一个新的控制台窗口,并且是异步的

请注意Windows样式路径如何(或者)用于指定目标脚本(这意味着您也可以使用c:cygwin64binbash而不是/bin/bash)。

更重要的是,请注意在这两种情况下都需要显式引用bash可执行文件,这与你尝试的形成鲜明对比:


您传递给mintty.exe的选项特定于- 它们不会传递给bash具体来说,您正在使用mintty.exe选项是(通过运行mintty --help查看所有选项):

  • -l, --log FILE|-......将输出记录到文件或标准输出
  • -i, --icon FILE[,IX]......从文件加载窗口图标,可选配索引

因此,-li在当前目录中创建一个名为i的日志文件,i因为它被解释为l的选项参数,而不是单独的选项i

但是,指定的脚本(/cygdrive/c/...)仍然执行 - 但至关重要的是,不是在登录 shell 中

如上所述,您要执行的操作需要显式调用bash可执行文件,以便Bash解释这些选项:

C:cygwin64binmintty /bin/bash -li c:pathtoyourscript

此外,如前所述,从批处理文件执行mintty.exe总是会创建一个新的控制台窗口,并且异步执行此操作- 也就是说,批处理文件会立即进入PAUSE命令,而不管mintty.exe进程是否已终止。

显然,该新窗口中输出的任何内容在原始窗口中都不可见。


可选阅读:与mintty.exe窗互:

警告:即使从批处理文件使用通常的start /wait方法,mintty.exe也会异步运行;也就是说,以下阻止批处理文件/命令提示符直到mintty.exe终止的尝试不起作用:

start /wait "" "c:cygwin64binmintty" # !! DOES NOT WORK - still asynchronous

当传递脚本/命令时,mintty.exe创建的 Bash 会话总是会在脚本终止时退出,因为bash- 即使它-i传递以指示交互式会话 - 在这种情况下会自动退出。

如果只需要在脚本终止后检查输出,请运行:

c:cygwin64binmintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script

请注意,一旦脚本退出,该窗口中没有 shell 运行,因此您所能做的就是检查脚本的输出 - 仅此而已。

要使外壳保持打开状态,您需要一个解决方法

c:cygwin64binmintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"

请注意,这会在脚本退出后创建一个新的shell 实例。

最新更新