我在 Windows 机器上创建了一个 .sh 脚本文件。我想双击运行它。如果我打开 Cygwin 终端并使用“sh”命令手动启动它,它就可以毫无问题地运行。
当我将 .sh 文件结尾与 c:\cygwin\bin\sh.exe 关联并双击 script.sh 时,会弹出一个终端,持续一毫秒,然后消失而没有任何效果。我认为问题是 sh.exe 需要像这样启动:
C:\cygwin64\bin\sh.exe --login –i
但是我如何告诉 Windows 运行这样的 .sh 文件呢?
答案1
您必须添加一个%1
参数才能使关联工作,例如像这样(处理嵌入空格的路径时需要引号):
C:\cygwin64\bin\sh.exe -li "%1"
这个问题之前已经在几个地方被问过;这些可能会有所帮助:
不过,脚本完成后窗口就会关闭 - 除非您在脚本中对此做了一些规定,例如,在其后跟一个read
命令(因为关联仅将脚本作为参数传递)。以下是关于这方面的一些讨论:
答案2
我对这里和互联网上其他地方找到的其他答案不满意,所以我花了大量时间研究如何正确地做到这一点。以下是我想到的。
- 创建一个名为的键
.sh
并将其(Default)
值设置Shell Script
为HKEY_CLASSES_ROOT
。Shell Script
在 下创建一个名为 的键HKEY_CLASSES_ROOT
,并将(Default)
值设置为Shell Script
。
shell
在 下创建一个名为 的键HKEY_CLASSES_ROOT\Shell Script
。open
创建一个名为under的键HKEY_CLASSES_ROOT\Shell Script\shell
并将(Default)
值设置为Run with Cygwin
。- 创建一个名为的项
command
,HKEY_CLASSES_ROOT\Shell Script\shell\open
并将(Default)
值设置为"C:\cygwin64\bin\mintty.exe" -i /Cygwin-Terminal.ico C:\cygwin64\bin\bash.exe -l -c "cd $(dirname \"$(cygpath -u \"%1\")\") ; $(cygpath -u \"%1\") ; exec bash"
(如果您使用的是 32 位版本,则更改为)C:\cygwin64\
。C:\cygwin\
现在您只需双击 .sh 文件,它就会按您预期的方式运行。
奖金:
DefaultIcon
创建一个名为under 的键HKEY_CLASSES_ROOT\Shell Script
并将(Default)
值设置为%SystemRoot%\System32\imageres.dll,-68
。这会将标准批处理文件图标应用于您的 shell 脚本。
我还创建了一个注册表补丁文件(另存为Run With Cygwin.reg
):
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.sh]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-68"
[HKEY_CLASSES_ROOT\Shell Script\shell]
[HKEY_CLASSES_ROOT\Shell Script\shell\open]
@="Run with Cygwin"
[HKEY_CLASSES_ROOT\Shell Script\shell\open\command]
@="\"C:\\cygwin64\\bin\\mintty.exe\" -i /Cygwin-Terminal.ico C:\\cygwin64\\bin\\bash.exe -l -c \"cd $(dirname \\\"$(cygpath -u \\\"%1\\\")\\\") ; $(cygpath -u \\\"%1\\\") ; exec bash\""
答案3
将以下内容放入批处理文件中,并为“.sh”文件的“打开方式”选择它:
@echo off
C:\cygwin\bin\bash.exe -lc "cd ""%cd%""; ""$(cygpath -u "%1")"""
'cd ""%cd%"";' 部分确保 shell 脚本始终在调用它的同一目录中启动,即使您的 Bash 配置文件尝试在您的主目录中启动。多层双引号是必要的,以便转义反斜杠并允许路径名中有空格。
为确保非内置命令可用,登录(-l)选项的替代方法是将 bin 目录添加到您的路径中:
@echo off
set path=%path%;C:\cygwin\bin
bash -c """$(cygpath -u "%1")"""
答案4
我从这里以及其他帖子和来源汇编了一个相当完整的解决方案。
另存为.reg并双击添加到注册表:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.sh]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-68"
[HKEY_CLASSES_ROOT\Shell Script\shell]
[HKEY_CLASSES_ROOT\Shell Script\shell\open]
[HKEY_CLASSES_ROOT\Shell Script\shell\open\command]
@="\"C:\\cygwin64\\bin\\mintty.exe\" -i /Cygwin-Terminal.ico -t \"%1\" /bin/bash -lc \"cd \\\"$(dirname \\\"$(cygpath -u \\\"%1\\\")\\\")\\\" ; \\\"$(cygpath -u \\\"%1\\\")\\\" %*\""
[HKEY_CLASSES_ROOT\Shell Script\shell\runas]
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Shell Script\shell\runas\command]
@="\"C:\\cygwin64\\bin\\mintty.exe\" -i /Cygwin-Terminal.ico -t \"%1\" /bin/bash -lc \"cd \\\"$(dirname \\\"$(cygpath -u \\\"%1\\\")\\\")\\\" ; \\\"$(cygpath -u \\\"%1\\\")\\\" %*\""
这将使用C:\cygwin64\bin\mintty.exe
和/bin/bash
,如果需要,更改两个键上的路径。
此解决方案:
只需双击任何可执行
.sh
文件即可。从文件
.sh
所在的目录运行。允许在文件
PATH
内正常运行任何命令.sh
。.sh
路径中带有空格的文件没有问题。允许右键单击->以管理员身份运行。
完成后关闭窗口。
唯一的限制是当有空格时参数传递不正确,并且拖放文件以将其路径作为参数传递不起作用。