@ECHO OFF
C:\cygwin64\bin\mintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)
PAUSE
我该怎么让这个起作用?
@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文件性质的更多详细信息,我可以提供更具体的帮助。祝您好运。
Patrick Kelly的有用答案指出,在Cygwin中不以login身份运行bash
可能是问题的根源。
确实如此:始终将Cygwin bash
作为login shell运行,因为否则关键的初始化将无法进行;特别是,$PATH
变量将不包含/usr/local/bin:/usr/bin
,而语言环境设置也将不正确。
为了使bash
启动为login 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
始终会打开一个新的控制台窗口,并且是异步执行的。c:\cygwin64\bin\bash
代替/bin/bash
)。bash
可执行文件,这与您尝试的方式形成对比:mintty.exe
传递的选项是特定于它本身的,不会传递给bash
。具体来说,您正在使用的mintty.exe
选项如下(通过运行mintty --help
查看所有选项):-li
在当前目录中创建名为i
的日志文件,因为i
被解释为l
的选项参数,而不是单独的选项i
。/cygdrive/c/...
)仍会被执行,但关键是不在登录shell中。bash
可执行文件,以便选项由Bash解释。C:\cygwin64\bin\mintty /bin/bash -li c:\path\to\your\script
此外,需要注意的是,从批处理文件中执行mintty.exe
总会创建一个新的控制台窗口,并且此过程是异步的——也就是说,无论mintty.exe
进程是否已终止,您的批处理文件都会立即继续执行PAUSE
命令。显然,在那个新窗口中输出的任何内容都不会在原始窗口中显示。
mintty.exe
窗口交互:注意:即使使用通常的start /wait
方法从批处理文件中运行mintty.exe
,mintty.exe
仍然会异步运行。也就是说,以下尝试阻止批处理文件/命令提示符直到mintty.exe
终止的方法不起作用:
start /wait "" "c:\cygwin64\bin\mintty" # !! DOES NOT WORK - still asynchronous
当传递一个脚本/命令时,由 mintty.exe
创建的 Bash 会话无论如何都会在脚本终止时退出,因为即使传递了-i
以指示交互式会话,bash
在这种情况下也会自动退出。
如果你只需要在脚本终止后 检查 输出结果,则运行:
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"
请注意,此操作会在脚本退出后创建一个新的 shell 实例。
mintty
是为 Windows
子系统(GCC -mwindows
)构建的,因此该应用程序不会附加到现有控制台,这就是为什么它表现为“异步”的原因。bash
是为 console
子系统(GCC -mconsole
)构建的,因此会附加到当前控制台并阻止您的命令提示符。 - gavenkoamintty.exe
是一个GUI子系统应用程序,但仅凭这一点并不能解释其行为,因为对于这样的应用程序,start /wait
也可以正常工作(尝试start /wait Notepad.exe
);我怀疑mintty.exe
通过另一个进程“间接”启动其GUI。 - mklement0procmon
检查了mintty
的行为:初始的mintty
创建了第二个mintty
并立即退出。这解释了start /wait
的作用:所以我错误地假设阻塞是在终端锁上。显然,/wait
等待子PID,因此mintty
实现了一个技巧来隐藏自己的PID。感谢您的解释:我不知道start /wait Notepad
! - gavenkoa