如何将.sh文件与Cygwin相关联?
我想通过在Windows中双击.sh文件在Cygwin中运行长rsync命令。它必须从文件的包含目录(例如/ cygdrive / c / scripts /)开始,以便相对路径起作用。有人得到这个工作吗?
注意:我刚刚找到了chere,这是一个管理Windows上下文菜单的Cygwin软件包(此处提示提示)。它可能有一些线索。
解决方案
一种有效的解决方案是创建一个.bat文件,该文件将打开cygwin并执行脚本。
用于执行位于我的主目录中的脚本" go.sh"的脚本:
@echo off C: chdir C:\cygwin\bin bash --login -i ./go.sh
我们应该能够将.sh文件与\ CYGWIN \ usr \ bin \ bash.exe关联。该脚本将不得不更改其自己的工作目录,我建议在顶部粘贴以下内容:
cd `dirname "$ cat test.bat @echo off set MYDIR=C:\scripts C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15""`
这不会关联.sh文件,但可能会为我们提供所需的信息。我从cygwin.bat批处理文件开始,该文件启动了Cygwin bash shell,并按如下所示进行了修改:
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"
那是一个玩具脚本,但是我们可以对其进行修改以调用rsync或者调用一个单独的shell脚本。我承认,如果没有MYDIR硬编码,那就更好了。有一种方法可以自动设置它。
哦,是的,当我在Cygwin的bash外壳中创建.bat文件时,我注意到我实际上必须先" chmod + x test.bat",然后才能双击启动它。我认为这是在设置NTFS权限。如果我们只是使用记事本,则不需要这样做。
在dos框中查看assoc和ftype命令。
这是我机器上.jpg的示例
assoc .sh=bashscript ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"'
确保在ftype命令中将bash的路径更改为与安装cygwin的位置匹配的路径
好的,我发现了一些可行的方法。按照Vladimir的建议,关联批处理文件无效,但是bash参数是关键。
简短而有趣:与以下命令关联:" C:\ cygwin \ bin \ bash.exe" -li"%1"%*
如果我们不知道该怎么做,请使用长版:
- 在资源管理器中,转到"工具/文件夹选项/文件类型"。
- 我已经有一个Bash脚本的SH条目。如果我们没有,请单击"新建"并输入" SH"以创建一个。
- 选择SH扩展名后,单击Advanced。
- 选择"打开"操作,然后单击"编辑"(或者创建操作)。
- 这是要使用的命令:" C:\ cygwin \ bin \ bash.exe" -li"%1"%*。请注意,如果没有-li,它将在我的脚本上重试"找不到命令"。
我们可能还希望将SH添加到PATHEXT环境变量中:
WinKey +暂停/高级/环境变量/系统变量/ PATHEXT
伙计们,谢谢帮助!
这是我的解决方案。它对我的* .sh脚本非常有效
无论它们在目录层次结构中的位置如何。
请注意,在调用之前,我先cd到cygpath目录名
在cygpath上重击。它只是工作。
C:\Dev\scripts\cygbashrun.bat
我只是没有打扰。我将.sh文件与Crimson Editor关联了(因为我花了很多时间在实际运行bug上工作)。现在只需在"文件类型">"高级"中获得正确的"打开方式/编辑方式"组合即可。如果我知道Crimson Editor使用的DDE代码是什么,那将使事情变得更容易。截至本文发布之时,我仍然无法找到它。
这让我想起了我的Mac时代(1993年至2008年),当时我曾经尝试过扫描应用程序,而不仅仅是获得基本的AppleScript脚本功能。
百事通
我使用PuttyCyg(在Cygwin窗口中很棒的腻子)来完成所有工作:
创建一个批处理脚本,例如。在我用过的机器上
SET CYGWIN=nodosfilewarning C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1
有内容
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
显然适应包含PuttyCyg安装路径。
然后在Windows文件资源管理器中,转到"工具"文件夹选项"文件类型"
如果尚不存在,则创建一个" .sh"条目(或者.bash,取决于我们希望脚本拥有什么)..然后"高级"。
[可选步骤]更改图标,然后从安装中选择Cygwin图标
然后:
- 新的..
- 动作=运行Bashscript ..
- 用于执行此操作的应用程序= C:\ Dev \ scripts \ cygbashrun.bat"%1"
对我来说就像一个魅力:O)
我使用Dragos的解决方案已有一段时间了,我认为它是最好的解决方案,因为它消除了在shell脚本中使用" cygpath -u"的需要。
然后,我想拥有其他功能,例如对.sh和.bash文件的拖放支持。经过一番挖掘之后,我写了一个.bat文件,将.sh和.bash文件关联为" bashscript",并为它们激活Windows资源管理器拖放处理程序。我必须编辑Dragos的命令以使其处理1个参数(在Shell脚本中放置的项目的路径)。
.bat文件大致如下:
#!/bin/bash if [ ! "" == "" ] then cygpath -u "" fi
Cygwin根目录中的" argshandler.sh"脚本仅通过cygpaths返回它收到的第一个参数,如果没有,则什么都不做(例如,如果我们双击脚本文件):
"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"
到目前为止,所有这些工作都很好。但是,仍有一些缺点可以很好地解决:
- 当涉及到位于UNC路径上的脚本时,例如Dragos的命令及其衍生版本将失败。 \ myserver \ myshare \ scriptfile.sh
- 只有1个删除的项目将传递到shell脚本。
不知何故,关于仅限1个项目的问题,更改了参数处理程序脚本以返回类似
...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'
并将Dragos命令的setter更改为
##代码##(请注意argshandler.sh部分周围的""不见了)似乎无法正常工作:如果拖到脚本上的某些项目的路径中包含空格,则这些路径将在空格处分解为多个参数即使它们每个都用双引号括起来...很奇怪。
是否有命令行专业人员愿意解决这些问题中的一个或者两个?