我想创建一个启动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文件性质的更多详细信息,我可以更具体.祝好运.
帕特里克·凯利的有用的答案指出,不运行bash
作为登录在Cygwin的壳可能是问题的根源。
确实:始终将Cygwin bash
作为登录 shell 运行,因为否则否则将不会进行关键的初始化;值得注意的是,该$PATH
变量将不包含/usr/local/bin:/usr/bin
,并且语言环境设置不正确。
为了bash
启动登录 shell,必须为bash可执行文件传递-l
选项(或其更长的别名--login
)。
要执行脚本:
在当前控制台窗口中,请参阅Patrick的答案。
请注意,除非目标脚本依赖于特定的工作目录,否则严格不需要使用-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
是特定于它的 -它们不会传递给bash
。
具体来说,mintty.exe
您使用的选项是(通过运行查看所有选项mintty --help
):
-l, --log FILE|-
...日志输出到文件或标准输出
-i, --icon FILE[,IX]
...从文件中加载窗口图标,可以选择带有索引
因此,-li
创建一个i
在当前目录中命名的日志文件,因为它i
被解释为l
的option-argument,而不是单独的option 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
当传递脚本/命令时,由B创建的Bash会话mintty.exe
将在脚本终止时始终退出,因为bash
即使在传递脚本-i
以指示交互式会话时,在这种情况下也会自动退出。
如果您只需要在脚本终止后检查输出,请运行:
c:\cygwin64\bin\mintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script
请注意,一旦脚本退出,该窗口中将不再运行任何外壳程序,因此您所要做的就是检查脚本的输出-仅此而已。
要保持外壳打开,您需要一种解决方法:
c:\cygwin64\bin\mintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"
请注意,这将在脚本退出后创建一个新的 Shell实例。