我想创建一个启动cygwin并执行特定命令的批处理文件(命令是读取bash文件并在其中执行一些命令)。
这是我开发的批处理文件,它在某种程度上有效。 cygwin终端打开并尝试读取bash文件,但无法执行内部命令:
@ECHO OFF
C:\cygwin64\bin\mintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)
PAUSE
我该如何做到这一点?
答案 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实例。