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

时间:2017-04-07 05:08:23

标签: windows bash batch-file cygwin piping

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

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

@ECHO OFF

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

PAUSE

我该如何做到这一点?

2 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:5)

Patrick Kelly's helpful answer指出在Cygwin中作为登录 shell运行bash可能是问题的根源。

确实:始终将Cygwin bash作为登录 shell运行,因为否则不会发生重要的初始化;值得注意的是,$PATH变量不会包含/usr/local/bin:/usr/bin,并且无法正确设置区域设置。

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

  • 执行脚本:

      当前控制台窗口中的
    • ,请参阅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总是会打开控制台窗口,并且异步

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

更重要的是,请注意在两种情况下如何明确引用bash可执行文件,这与您尝试过的内容形成鲜明对比:

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

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

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

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

您打算做什么需要显式调用bash可执行文件,如上所示,以便选项由 Bash 解释:

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

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

显然,在新窗口中输出的内容在原始窗口中将不可见。

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

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

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

传递脚本/命令时,mintty.exe创建的Bash会话将在脚本终止时退出 ,因为bash - 甚至当它通过-i表示交互式会话时 - 将在这种情况下自动退出。

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

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

请注意,一旦脚本退出,该窗口中就不会运行任何shell,所以您只能检查脚本的输出 - 仅此而已。

要打开shell ,您需要解决方法

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

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