我想创建一个启动cygwin并执行特定命令的批处理文件(该命令是读取bash文件并在其中执行某些命令)。
这是我开发的批处理文件,它在某种程度上有效。 Cygwin终端打开并尝试读取bash文件,但无法执行其中的命令:
@ECHO OFF
C:cygwin64binmintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)
PAUSE
我怎样才能做到这一点?
从批处理文件中,启动 Cygwin 的 bash shell 并使用登录标志。 这为通过.bash_profile
或.bashrc
文件设置路径和环境变量奠定了基础。我相信这可能是你困难的根源。
@ echo off
C:cygwin64binbash --login -c "cd ~/path/to/desired; ./mybashfile.sh"
如果您提供有关 bash 文件性质的更多详细信息,我可以更具体。 祝你好运。
Patrick Kelly的有用回答指出,在Cygwin中不将bash
作为登录shell运行可能是问题的根源。
事实上:始终将 Cygwinbash
作为登录shell 运行,因为否则不会进行关键的初始化;值得注意的是,$PATH
变量不会包含/usr/local/bin:/usr/bin
,并且语言环境设置不正确。
为了使bash
启动登录shell,必须向bash 可执行文件传递-l
选项(或其更长的别名,--login
)。
-
要执行脚本,请执行以下操作:
-
在当前控制台窗口中,查看 Patrick 的答案。
-
请注意,除非目标脚本依赖于特定的工作目录,否则将
-c
与单独的cd
和执行命令一起使用并不是绝对必要的;如下所示就可以了:C:cygwin64binbash -l c:pathtoyourscript
-
-
在
mintty.exe
中,Cygwin附带的终端应用程序(正如您尝试过的那样):C:cygwin64binmintty /bin/bash -l c:pathtoyourscript
- 请注意,从命令提示符或批处理文件执行
mintty
总是会打开一个新的控制台窗口,并且是异步的。
- 请注意,从命令提示符或批处理文件执行
-
请注意Windows样式路径如何(或者)用于指定目标脚本(这意味着您也可以使用c:cygwin64binbash
而不是/bin/bash
)。
更重要的是,请注意在这两种情况下都需要显式引用bash
可执行文件,这与你尝试的形成鲜明对比:
您传递给mintty.exe
的选项特定于它- 它们不会传递给bash
。具体来说,您正在使用mintty.exe
选项是(通过运行mintty --help
查看所有选项):
-l, --log FILE|-
......将输出记录到文件或标准输出-i, --icon FILE[,IX]
......从文件加载窗口图标,可选配索引
因此,-li
在当前目录中创建一个名为i
的日志文件,i
因为它被解释为l
的选项参数,而不是单独的选项i
。
但是,指定的脚本(/cygdrive/c/...
)仍然执行 - 但至关重要的是,不是在登录 shell 中。
如上所述,您要执行的操作需要显式调用bash
可执行文件,以便Bash解释这些选项:
C:cygwin64binmintty /bin/bash -li c:pathtoyourscript
此外,如前所述,从批处理文件执行mintty.exe
总是会创建一个新的控制台窗口,并且异步执行此操作- 也就是说,批处理文件会立即进入PAUSE
命令,而不管mintty.exe
进程是否已终止。
显然,该新窗口中输出的任何内容在原始窗口中都不可见。
可选阅读:与mintty.exe
窗互:
警告:即使从批处理文件使用通常的start /wait
方法,mintty.exe
也会异步运行;也就是说,以下阻止批处理文件/命令提示符直到mintty.exe
终止的尝试不起作用:
start /wait "" "c:cygwin64binmintty" # !! DOES NOT WORK - still asynchronous
当传递脚本/命令时,mintty.exe
创建的 Bash 会话总是会在脚本终止时退出,因为bash
- 即使它-i
传递以指示交互式会话 - 在这种情况下会自动退出。
如果只需要在脚本终止后检查输出,请运行:
c:cygwin64binmintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script
请注意,一旦脚本退出,该窗口中没有 shell 运行,因此您所能做的就是检查脚本的输出 - 仅此而已。
要使外壳保持打开状态,您需要一个解决方法:
c:cygwin64binmintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"
请注意,这会在脚本退出后创建一个新的shell 实例。