在 Windows 上使用 Cygwin 双击运行 .sh 文件

在 Windows 上使用 Cygwin 双击运行 .sh 文件

我在 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

我对这里和互联网上其他地方找到的其他答案不满意,所以我花了大量时间研究如何正确地做到这一点。以下是我想到的。

  1. 创建一个名为的键.sh并将其(Default)值设置Shell ScriptHKEY_CLASSES_ROOT
    • Shell Script在 下创建一个名为 的键HKEY_CLASSES_ROOT,并将(Default)值设置为Shell Script
  2. shell在 下创建一个名为 的键HKEY_CLASSES_ROOT\Shell Script
  3. open创建一个名为under的键HKEY_CLASSES_ROOT\Shell Script\shell并将(Default)值设置为Run with Cygwin
  4. 创建一个名为的项commandHKEY_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 文件,它就会按您预期的方式运行。

奖金:

  1. 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路径中带有空格的文件没有问题。

  • 允许右键单击->以管理员身份运行。

  • 完成后关闭窗口。

唯一的限制是当有空格时参数传递不正确,并且拖放文件以将其路径作为参数传递不起作用。

相关内容