2011-11-27 183 views
18

我知道Cygwin安装时有一个批处理文件,用于在Windows中启动它。但如果我想运行脚本而不启动Cygwin并执行“./script”Cygwin从一个批处理文件运行脚本?

如何创建批处理文件来执行此操作?

由于...只有一个批处理文件,单击时会打开Cygwin并运行shell脚本。

回答

27

运行“foo.bsh”,创建一个批处理文件包含以下内容并运行它:

set PATH=C:\cygwin\bin;%PATH% 
    c:\cygwin\bin\bash.exe c:\path\to\foo.bsh 

的“C:\ cygwin的\ BIN”部分可以根据您选择的安装位置不同cygwin的。

+0

是的,这工作..谢谢 – dhroove

3

什么样的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”与批处理脚本位于相同的目录中。

再次,这也将工作在一个快捷方式,而不是批处理脚本。

+0

那么,我想运行一个shell脚本。但我不想打开Cywgin然后输入所有的东西来执行它。我宁愿运行一个批处理文件来打开cygwin,然后在可能的情况下这样做。 – Aaron

+1

@Aaron - 键入所有的东西?任何用于在cygwin中执行脚本的命令行(包括命令行参数)都可以添加到快捷方式或批处理脚本中。 Cygwin不会打开,但一个cmd窗口将会打开。脚本运行完毕后它应该关闭。 –

+0

我有一个我在cygwin中运行的shell脚本。我想知道是否可以创建一个批处理文件,而不是全部输入这些文件?但我不确定如何在批处理文件中使用cygwin。 – Aaron

8

你可以尝试这样的事情蹦床从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" 
+1

这对我很好,但我发现我不得不使用UNIX风格线结束时保存文件,以确保bash脚本很高兴。 – gdt

5

我想在奥斯汀黑斯廷斯给出的答案扩展到允许不工作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。现在用空格正确处理参数。

+0

尽管我们如何退出此命令?在'TRAMPOLINE'不起作用后放置'exit/B'。 –

+0

只需在'TRAMPOLINE'行'bash'后输入'exit'作为环境。 'exit/B'是一个'cmd'命令。 – galmok

+0

我问,因为在我的情况'退出'看起来不起作用。我后来发现,那是因为我正在创建一个登录shell(-I),而在''.bashrc'等内容中创建了额外的bash实例,这些实例在后台悬挂(因此防止从cmd窗口中杀死) 。 –

0

要从任何bat文件运行 “your_bash_file”,写入下面一行.BAT:

GIT-bash.exe(path_to_your_bash_file>)

P.S. Windows Git是必要的安装

1

如果你想打开脚本在一个薄荷窗口以及,这(基于@ 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的需要。该批处理文件将在之后退出。