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

Creating batch file to start cygwin and execute specific command

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

这是我开发的批处理文件,在一定程度上可以使用。 cygwin 终端打开并尝试读取 bash 文件,但无法执行其中的命令:

@ECHO OFF

C:\cygwin64\bin\mintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)

PAUSE

我怎样才能使这个工作?

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

@ echo off
C:\cygwin64\bin\bash --login -c "cd ~/path/to/desired; ./mybashfile.sh"

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

Patrick Kelly's helpful answer 指出 not 运行ning bash 作为 login [= Cygwin 中的 195=] 可能是问题的根源。

确实:总是运行 Cygwin bash作为登录 shell,因为关键的初始化将不会进行地点;值得注意的是,$PATH 变量不会包含 /usr/local/bin:/usr/bin,并且区域设置不会正确设置。

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

  • 要执行您的脚本:

    • current 控制台 window 中,请参阅 Patrick's answer

      • 请注意,除非目标脚本依赖于特定的工作目录,否则将 -c 与单独的 cd 和执行命令一起使用并不是绝对必要的;像下面这样的事情会做:

        C:\cygwin64\bin\bash -l c:\path\to\your\script
        
    • mintty.exe中,Cygwin自带的终端应用(如你所试):

      C:\cygwin64\bin\mintty /bin/bash -l c:\path\to\your\script
      
      • 请注意,从命令提示符或批处理文件执行 mintty 总是会打开一个 new 控制台 window,并且 异步执行.

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

更重要的是,请注意在这两种情况下如何显式引用 bash 可执行文件,这与您尝试的:


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

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

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

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

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

C:\cygwin64\bin\mintty /bin/bash -li c:\path\to\your\script

此外,如前所述,从批处理文件执行 mintty.exe 总是会创建一个 new 控制台 window,并且 异步执行 - 也就是说,无论 mintty.exe 进程是否已终止,您的批处理文件都会立即执行 PAUSE 命令。

显然,无论在新 window 中输出什么,在原始 window 中都将不可见。


可选阅读:与mintty.exewindow互动:

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

start /wait "" "c:\cygwin64\bin\mintty" # !! DOES NOT WORK - still asynchronous

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

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

c:\cygwin64\bin\mintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script

请注意,一旦脚本退出,shell 不会 运行ning 在 window 中,因此您所能做的就是 检查 脚本的输出 - 仅此而已。

要使 shell 保持打开状态,您需要 解决方法:

c:\cygwin64\bin\mintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"

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