当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《创建批处理文件以启动cygwin并执行特定命令》经验,为你挑选了2个好方法。

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

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

@ECHO OFF

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

PAUSE

我怎样才能做到这一点?



1> Patrick Kell..:

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

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

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



2> mklement0..:

帕特里克·凯利的有用的答案指出,运行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 /waitmintty.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实例。

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有