当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将.sh文件与Cygwin关联?》经验,为你挑选了3个好方法。

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

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



1> Jerph..:

好的,我发现了一些有用的东西.将批处理文件关联为Vladimir建议不起作用,但bash参数是关键.

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

长版如果你不知道如何:

    在资源管理器中,转到工具/文件夹选项/文件类型.

    我已经有了Bash Script的SH条目.如果没有,请单击"新建"并输入"SH"以创建一个.

    选择SH扩展名后,单击"高级".

    选择"打开"操作,然后单击编辑(或创建操作).

    这是使用的命令:"C:\ cygwin\bin\bash.exe"-li"%1"%*.请注意,如果没有-li,它会在我的脚本上停止"找不到命令".

您可能还想将SH添加到PATHEXT环境变量中:

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

谢谢你的帮助,伙计们!


有谁知道如何在Windows 7中执行此操作?似乎缺少"文件类型"选项.
@adib有点晚了,只是为了文档:我通过"打开方式..."对话框选择了`cygwin/bin/bash.exe`(右键单击文件).然后我打开regedit并将`HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command`的值更改为`"C:\ cygwin\bin\bash.exe"-li"%1"`(取决于你的文件系统)地点)
@MattConnolly是的,只需用`"C:\ Cygwin\bin\mintty.exe"/ bin/bash -li"%替换`"C:\ cygwin\bin\bash.exe"-li"%1"%*` 1"%*`
我没有使用`-l`或`-i`,一切正常.`-l`用于交互式登录shell,它来源你的个人资料和bashrc文件.`-i`用于交互式非登录shell,它只提供bashrc文件.对于脚本(通常由非交互式非登录shell执行),脚本不应该是必需的.如果你必须使用`-li`,你的Cygwin设置就会出现问题.你的系统PATH环境变量中有Cygwin的bin目录(例如`C:\ cygwin\bin\dir`)吗?

2> 小智..:

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

assoc .sh=bashscript

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


您可以通过在[HKEY_CLASSES_ROOT\bashscript\DefaultIcon]向Windows注册表添加密钥来更改这些shell脚本的图标.值名称为(默认).REG_SZ值指向ico或dll和偏移量:C:\ cygwin\Cygwin.ico

3> 小智..:

我一直在使用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

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

当涉及位于UNC路径上的脚本时,Dragos的命令及其衍生物会失败,例如\\ 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部分周围的""似乎没有正常工作:如果拖动到脚本中的某些项目在其路径中包含空白,则所述路径将在空白处分解为多个参数即使他们每个都用双引号括起来......很奇怪.

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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有