如何将.sh文件与Cygwin关联?

时间:2008-09-19 20:05:32

标签: windows bash cygwin

我想通过双击Windows中的.sh文件在Cygwin中运行一个长rsync命令。它必须从文件的包含目录(例如/ cygdrive / c / scripts /)开始,以便相对路径起作用。有人让这个工作吗?

注意:我刚刚找到here,一个管理Windows上下文菜单的Cygwin包(Bash Prompt Here)。它可能有一些线索。

13 个答案:

答案 0 :(得分:41)

好的,我找到了有用的东西。将批处理文件关联为Vladimir建议不起作用,但bash参数是关键。

简短而甜蜜:与此命令关联:“C:\ cygwin \ bin \ bash.exe”-li“%1”%*

长版如果你不知道如何:

  1. 在资源管理器中,转到工具/文件夹选项/文件类型。
  2. 我已经有了Bash Script的SH条目。如果没有,请单击“新建”并输入“SH”以创建一个。
  3. 选择SH扩展名后,单击“高级”。
  4. 选择“打开”操作,然后单击编辑(或创建操作)。
  5. 这是要使用的命令:“C:\ cygwin \ bin \ bash.exe”-li“%1”%* 。请注意,如果没有 -li ,则会在我的脚本上停止“找不到命令”。
  6. 您可能还想将 SH 添加到 PATHEXT 环境变量中:

    WinKey + Pause / Advanced / Environment Variables / System Variables / PATHEXT

    感谢您的帮助,伙计们!

答案 1 :(得分:15)

这是我的解决方案。它适用于我的* .sh脚本 无论它们在目录层次结构中的何处。 请注意,我在调用之前cd到cygpath dirname bash在cygpath上。它只是有效。

assoc .sh=bashscript

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"'

答案 2 :(得分:6)

我一直在使用Dragos的解决方案已有一段时间了,我认为它是最好的解决方案,因为它需要在shell脚本中使用“cygpath -u”。

然后我希望获得其他功能,例如.sh和.bash文件的拖放支持。经过一番挖掘后,我写了一个.bat,它将.sh和.bash文件关联为“bashscript”,并为它们激活Windows资源管理器拖放处理程序。我不得不编辑Dragos的命令,使其处理1个参数(在shell脚本上删除项目的路径)。

.bat文件大致如下:

echo Registering .sh and .bash files as "bashscript"...
assoc .sh=bashscript
assoc .bash=bashscript
echo.
echo Setting the run command for the file type "bashscript"...
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"'
echo.
echo Activating the drag^&drop capability for "bashscript" files (only 1 dropped item
echo will be passed to the script, multiple items are not supported yet)...
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f

Cygwin根目录中的“argshandler.sh”脚本只是cygpaths返回它收到的第一个参数,如果没有,则没有任何内容(例如,如果你只是双击脚本文件):

#!/bin/bash
if [ ! "$1" == "" ]
then
    cygpath -u "$1"
fi

到目前为止,这一切都很顺利。但是,仍有一些缺点可以解决:

  • Dragos'命令和我的衍生物在涉及位于UNC路径上的脚本时失败,例如: \\ MYSERVER \ myshare的\ scriptfile.sh
  • 只有1个已删除的项目将传递给shell脚本。

不知何故,关于1-dropped-item-only问题,更改参数处理程序脚本以返回类似

的内容
"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"

并将Dragos命令的setter更改为

...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'

(注意argshandler.sh部分周围的“”似乎没有正常工作:如果拖动到脚本中的某些项目在其路径中包含空白,则所述路径将被分解为多个参数在空白处尽管每个都用双引号括起来......很奇怪。

是否有任何命令行专业人员能够解决其中一个或两个问题?

答案 3 :(得分:2)

这不会关联.sh文件,但它可能会让你得到你想要的。我开始使用启动Cygwin bash shell的cygwin.bat批处理文件,并对其进行修改:

$ cat test.bat
@echo off

set MYDIR=C:\scripts

C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15"

这是一个玩具脚本,但您可以修改它以调用rsync或调用单独的shell脚本。我承认如果它没有MYDIR硬编码会更好。有一种方法可以让它自动设置它。

哦,是的,当我在Cygwin的bash shell中创建.bat文件时,我注意到我必须实际上“chmod + x test.bat”才能通过双击启动它。我认为它正在设置NTFS权限。如果您只是使用记事本,则不需要这样做。

答案 4 :(得分:2)

这是我正在使用的命令:

HTTP/1.1 200 Ok

它以精简形式运行,最大化,将窗口标题设置为正在运行的脚本(Windows路径),将目录更改为脚本所在位置,运行它并在完成后保持打开状态。

或者,这会将标题设置为脚本的cygwin路径:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

为您设置关联的批处理脚本:

标题中的Windows路径:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%1")\007" && cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

标题中的cygwin路径:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause

答案 5 :(得分:1)

您应该能够将.sh文件与\ CYGWIN \ usr \ bin \ bash.exe相关联。该脚本将不得不更改自己的工作目录,我建议在顶部粘贴这样的东西:

cd `dirname "$0"`

答案 6 :(得分:1)

    Windows Registry Editor Version 5.00
    ;File:ConfigureShToBeRunUnderExplorer.reg v:1.0 docs at the end
    [HKEY_CLASSES_ROOT\Applications\bash.exe] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command]
    @="C:\\cygwin\\bin\\bash.exe -li \"%1\" %*"

    ; This is a simple registry file to automate the execution of sh via cygwin on windows 7, might work on other Windows versions ... not tested 
    ; you could add this setting by issueing the following command: reg import ConfigureShToBeRunUnderExplorer.reg 
    ; Note the path of your bash.exe
    ; Note that you still have to add the .sh to your %PATHTEXT%
            ; usage: double - click the file or reg import file 

答案 7 :(得分:1)

环顾不同地方之后。我想出的是,首先从Windows“打开方式...”对话框中选择C:\cygwin64\bin\mintty.exe 然后编辑

的注册表值
[Computer\HKEY_CLASSES_ROOT\Applications\mintty.exe\shell\open\command]

C:\cygwin64\bin\mintty.exe -t "%1" /bin/bash -l -i -c "v1=\"$(cygpath -u \"%0\" -a)\" && v2=\"$(dirname \"$v1\")\" && cd \"$v2\" ; exec bash  \"%1\" %*"  

答案 8 :(得分:0)

一个有效的解决方案是创建一个.bat文件,它将打开cygwin并执行你的脚本。

执行位于我的主目录中的脚本go.sh的脚本:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh

答案 9 :(得分:0)

查看dos框中的assoc和ftype命令。 这是我机器上.jpg的一个例子

c:\>assoc .jpg
.jpg=jpegfile

c:\>ftype jpegfile
jpegfile="C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1"

assoc .sh=bashscript

ftype bashscript="c:\cygwin\bin\bash.exe" "%1"

确保在 ftype 命令中更改bash的路径,以匹配您安装 cygwin 的位置

答案 10 :(得分:0)

我只是没有打扰。我将.sh文件与Crimson Editor关联起来(因为我花了尽可能多的时间来解决bug,因为我实际运行它们)。现在,在“文件类型”和“高级”中使用正确的“打开/编辑”组合是一个问题。如果我知道Crimson Editor使用的DDE代码,那会让事情变得更容易;但是,就这篇文章而言,我无法找到它。

这让我想起了我的Mac时代(1993-2008),当时我曾尝试扫描应用程序而不是基本的AppleScript脚本编写。

BZT

答案 11 :(得分:0)

我使用PuttyCyg(在Cygwin窗口中有很棒的腻子)这里是如何实现这一目标的:

创建批处理脚本,例如。在我的机器上我用了

C:\Dev\scripts\cygbashrun.bat

内容

SET CYGWIN=nodosfilewarning
C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1

显然适应包含PuttyCyg安装的路径。

然后在Windows文件资源管理器中转到工具 - 文件夹选项 - 文件类型

创建“.sh”条目(如果还没有)(或.bash,具体取决于您喜欢的脚本)..然后高级..

[可选步骤]更改图标并从安装中选择Cygwin图标

然后:

  1. 新..
  2. 动作=运行Bashscript ..
  3. 用于执行此操作的应用程序= C:\ Dev \ scripts \ cygbashrun.bat“%1”
  4. 对我来说就像一个魅力:O)

答案 12 :(得分:0)

我自己开发了一个.bat脚本(不是源自其他人的答案),将文件类型(例如* .cygwin)与此.bat关联打开,如下所示:

=== file run-script-with-Cygwin-in-same-dir.bat ===

@echo off
REM   Info: A script created by Johnny Wong.  (last modified on 2014-7-15)
REM   It is used to pass a file argument to run a bash script file.  The current directory is setting to the path of the script file for convenience.
REM   Could be copied to C:\cygwin;  and then you manually associate .cygwin file extension to open with this .bat file.
set CYGWIN=nodosfilewarning

C:\cygwin\bin\bash --login -i -c 'cd "`dirname "%~1"`"; exec bash "%~1" %2 %3 %4 %5 %6 %7 %8 %9'

REM finally pause the script (press any key to continue) to keep the window to see result
pause

=== file run-script-with-Cygwin-in-same-dir.bat ===

使用语法的详细解释(如果您感兴趣):

    如果将要使用此.bat打开的文件关联,则
  1. %1为“...”。对于将文件拖到此.bat,仅当文件的路径有空格时才引用“...”。
  2. %〜1与%1相同,如果它们存在则消除了周围的双引号
  3. 要从%p%中移除周围的双引号,请使用for %%a in (%p%) do set p=%%~a
  4. 您必须使用"%~1"强制脚本文件的路径加双引号,以便在被视为转义字符时,bash不会删除其文件夹分隔符'\'(在%1中)。否则,将此路径中没有空格的文件拖动到此.bat时,它不起作用。
  5. “exec bash”可以只是“bash”,前者用于为更多的bash过程节省资源。
  6. 喜欢:)