创建批处理文件以启动 cygwin 并执行特定命令
Creating batch file to start cygwin and execute specific command
我想创建一个启动 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 文件性质的更多详细信息,我可以更具体。祝你好运。
Patrick Kelly's helpful answer 指出 not 运行ning bash
作为 login [= Cygwin 中的 195=] 可能是问题的根源。
确实:总是运行 Cygwin bash
作为登录 shell,因为关键的初始化将不会进行地点;值得注意的是,$PATH
变量不会包含 /usr/local/bin:/usr/bin
,并且区域设置不会正确设置。
为了使 bash
启动 login shell,bash 可执行文件必须传递 -l
选项(或其更长的别名,--login
)。
要执行您的脚本:
在 current 控制台 window 中,请参阅 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
总是会打开一个 new 控制台 window,并且 异步执行.
请注意如何使用 Windows 样式的路径(或者)指定目标脚本(这意味着您可以使用 c:\cygwin64\bin\bash
/bin/bash
也是)。
更重要的是,请注意在这两种情况下如何显式引用 bash
可执行文件,这与您尝试的:
您传递给 mintty.exe
的选项特定于 它 - 它们 未 通过至 bash
.
具体来说,您使用的 mintty.exe
个选项是(通过 运行ning mintty --help
查看所有选项):
-l, --log FILE|-
... 将输出记录到文件或标准输出
-i, --icon FILE[,IX]
... 从文件中加载 window 图标,可选择使用索引
因此,-li
在当前目录中创建了一个名为 i
的日志文件,因为 i
被解释为 l
的选项参数,而不是单独的选项 i
.
指定的脚本 (/cygdrive/c/...
) 仍然执行,但是 - 但至关重要的是,不在登录中 shell.
您想要执行的操作需要显式调用 bash
可执行文件,如上所示,以便 Bash 解释选项:
C:\cygwin64\bin\mintty /bin/bash -li c:\path\to\your\script
此外,如前所述,从批处理文件执行 mintty.exe
总是会创建一个 new 控制台 window,并且 异步执行 - 也就是说,无论 mintty.exe
进程是否已终止,您的批处理文件都会立即执行 PAUSE
命令。
显然,无论在新 window 中输出什么,在原始 window 中都将不可见。
可选阅读:与mintty.exe
window互动:
警告:mintty.exe
运行s 异步 即使使用通常的 start /wait
方法来自批处理文件;也就是说,以下阻止批处理文件/命令提示符直到 mintty.exe
终止的尝试 不会 起作用:
start /wait "" "c:\cygwin64\bin\mintty" # !! DOES NOT WORK - still asynchronous
当传递一个脚本/命令时,由mintty.exe
创建的Bash会话在脚本终止时总是退出,因为 bash
- 即使通过 -i
以指示 interactive 会话 - 在这种情况下也会自动退出。
如果您只需要检查脚本终止后的输出,运行:
c:\cygwin64\bin\mintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script
请注意,一旦脚本退出,shell 不会 运行ning 在 window 中,因此您所能做的就是 检查 脚本的输出 - 仅此而已。
要使 shell 保持打开状态,您需要 解决方法:
c:\cygwin64\bin\mintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"
请注意,这会在脚本退出后创建一个 new shell 实例。
我想创建一个启动 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 文件性质的更多详细信息,我可以更具体。祝你好运。
Patrick Kelly's helpful answer 指出 not 运行ning bash
作为 login [= Cygwin 中的 195=] 可能是问题的根源。
确实:总是运行 Cygwin bash
作为登录 shell,因为关键的初始化将不会进行地点;值得注意的是,$PATH
变量不会包含 /usr/local/bin:/usr/bin
,并且区域设置不会正确设置。
为了使 bash
启动 login shell,bash 可执行文件必须传递 -l
选项(或其更长的别名,--login
)。
要执行您的脚本:
在 current 控制台 window 中,请参阅 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
总是会打开一个 new 控制台 window,并且 异步执行.
- 请注意,从命令提示符或批处理文件执行
请注意如何使用 Windows 样式的路径(或者)指定目标脚本(这意味着您可以使用 c:\cygwin64\bin\bash
/bin/bash
也是)。
更重要的是,请注意在这两种情况下如何显式引用 bash
可执行文件,这与您尝试的:
您传递给 mintty.exe
的选项特定于 它 - 它们 未 通过至 bash
.
具体来说,您使用的 mintty.exe
个选项是(通过 运行ning mintty --help
查看所有选项):
-l, --log FILE|-
... 将输出记录到文件或标准输出-i, --icon FILE[,IX]
... 从文件中加载 window 图标,可选择使用索引
因此,-li
在当前目录中创建了一个名为 i
的日志文件,因为 i
被解释为 l
的选项参数,而不是单独的选项 i
.
指定的脚本 (/cygdrive/c/...
) 仍然执行,但是 - 但至关重要的是,不在登录中 shell.
您想要执行的操作需要显式调用 bash
可执行文件,如上所示,以便 Bash 解释选项:
C:\cygwin64\bin\mintty /bin/bash -li c:\path\to\your\script
此外,如前所述,从批处理文件执行 mintty.exe
总是会创建一个 new 控制台 window,并且 异步执行 - 也就是说,无论 mintty.exe
进程是否已终止,您的批处理文件都会立即执行 PAUSE
命令。
显然,无论在新 window 中输出什么,在原始 window 中都将不可见。
可选阅读:与mintty.exe
window互动:
警告:mintty.exe
运行s 异步 即使使用通常的 start /wait
方法来自批处理文件;也就是说,以下阻止批处理文件/命令提示符直到 mintty.exe
终止的尝试 不会 起作用:
start /wait "" "c:\cygwin64\bin\mintty" # !! DOES NOT WORK - still asynchronous
当传递一个脚本/命令时,由mintty.exe
创建的Bash会话在脚本终止时总是退出,因为 bash
- 即使通过 -i
以指示 interactive 会话 - 在这种情况下也会自动退出。
如果您只需要检查脚本终止后的输出,运行:
c:\cygwin64\bin\mintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script
请注意,一旦脚本退出,shell 不会 运行ning 在 window 中,因此您所能做的就是 检查 脚本的输出 - 仅此而已。
要使 shell 保持打开状态,您需要 解决方法:
c:\cygwin64\bin\mintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"
请注意,这会在脚本退出后创建一个 new shell 实例。