Cygwin从一个批处理文件运行脚本?
我知道Cygwin安装时有一个批处理文件,用于在Windows中启动它。但如果我想运行脚本而不启动Cygwin并执行“./script”Cygwin从一个批处理文件运行脚本?
如何创建批处理文件来执行此操作?
由于...只有一个批处理文件,单击时会打开Cygwin并运行shell脚本。
运行“foo.bsh”,创建一个批处理文件包含以下内容并运行它:
set PATH=C:\cygwin\bin;%PATH%
c:\cygwin\bin\bash.exe c:\path\to\foo.bsh
的“C:\ cygwin的\ BIN”部分可以根据您选择的安装位置不同cygwin的。
什么样的shell脚本?击?如果您需要运行bash脚本,只需通过快捷方式使用bash.exe运行即可。目标会是这样的:
C:\cygwin\bin\bash.exe foo.bsh
到bash.exe将取决于安装的cygwin所在的路径。 (如果bin目录位于路径环境变量中,则根本不需要路径。)
如果需要,可以在批处理脚本中执行同样的操作。命令行将与上面的“目标”相同。
编辑基于评论(仍然假设的bash):
好了,在你的批处理脚本(.bat)的形式只需键入:
bash.exe script.txt
您可能需要添加路径到“bash.exe”。如果您不确定“bash.exe”的位置,请打开您在问题中提到的“Cygwin.bat”文件。它应该有一个chdir
命令中的路径。 (注意:Cygwin.bat只是在交互模式下运行bash.exe,它并不真正运行任何名为“cygwin”的东西)。
如果不是,则还需要将路径添加到“script.txt”与批处理脚本位于相同的目录中。
再次,这也将工作在一个快捷方式,而不是批处理脚本。
你可以尝试这样的事情蹦床从CMD到BASH(或任何SH-变体):
: <<TRAMPOLINE
@echo off
bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1)
bash "%~f0" "%*"
goto :EOF
TRAMPOLINE
#####################
#!/bin/bash -- it's traditional!
echo "Hello from $SHELL"
这对我很好,但我发现我不得不使用UNIX风格线结束时保存文件,以确保bash脚本很高兴。 – gdt
我想在奥斯汀黑斯廷斯给出的答案扩展到允许不工作Cygwin在路径中,并使用bat文件在目录设置中工作(因此即使是使用不同“Start in”路径的快捷方式也是如此)。所做的更改包括bash的完整路径,使用选项-l
可以使用路径和环境正确设置bash,并将当前目录作为弹出的第一个参数(使用shift
)传递给bash。请记住在文件中使用Unix换行符,否则会出现很多错误。也使用UTF8代替ANSI。
: <<TRAMPOLINE
@echo off
C:\cygwin\bin\bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1)
setlocal EnableDelayedExpansion
for %%i in (%*) do set _args= !_args! "%%~i"
C:\cygwin\bin\bash -l "%~f0" "%CD%" %_args%
goto :EOF
TRAMPOLINE
#####################
#!/bin/bash -- it's traditional!
cd "$1"
shift
echo Working from $PWD
编辑:修正了将参数正确传递给bash的蹦床代码。 BAT文件没有与“$ @”相同的bash,并且处理每个参数的循环都被创建并传递给bash.exe。现在用空格正确处理参数。
尽管我们如何退出此命令?在'TRAMPOLINE'不起作用后放置'exit/B'。 –
只需在'TRAMPOLINE'行'bash'后输入'exit'作为环境。 'exit/B'是一个'cmd'命令。 – galmok
我问,因为在我的情况'退出'看起来不起作用。我后来发现,那是因为我正在创建一个登录shell(-I),而在''.bashrc'等内容中创建了额外的bash实例,这些实例在后台悬挂(因此防止从cmd窗口中杀死) 。 –
要从任何bat文件运行 “your_bash_file”,写入下面一行.BAT:
GIT-bash.exe(path_to_your_bash_file>)
P.S. Windows Git是必要的安装
如果你想打开脚本在一个薄荷窗口以及,这(基于@ galmok的答案)将做的伎俩。
: <<TRAMPOLINE
@echo off
C:\Users\user\Downloads\cyg-packages\bin\bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1)
setlocal EnableDelayedExpansion
for %%i in (%*) do set _args= !_args! "%%~i"
C:\Users\user\Downloads\cyg-packages\bin\mintty.exe -i /Cygwin-Terminal.ico C:\Users\user\Downloads\cyg-packages\bin\bash -l "%~f0" "%CD%" %_args%
goto :EOF
TRAMPOLINE
#####################
#!/bin/bash -- it's traditional!
cd "$1"
shift
echo Working from $PWD
vim "[email protected]"
注:我用例是从Visual Studio,这也就是为什么在年底vim
调用打开一个终端VIM的需要。该批处理文件将在之后退出。
是的,这工作..谢谢 – dhroove