6

Я создал файл сценария .sh на своем компьютере с Windows. Я хотел бы запустить его по двойному клику. Если я открываю терминал Cygwin и запускаю его вручную с помощью команды «sh», он запускается без проблем.

Когда я связываю окончания файла .sh с c:\cygwin\bin\sh.exe и дважды щелкаю на script.sh, терминал выскакивает на миллисекунду и исчезает безрезультатно. Я думаю, что проблема в том, что sh.exe должен быть запущен так:

C:\cygwin64\bin\sh.exe --login –i

Но как я могу сказать Windows, чтобы запустить .sh файлы, как это?

4 ответа4

7

Вы должны добавить параметр %1 чтобы заставить работать ассоциацию, например, вот так (кавычки необходимы для работы с путями со встроенными пробелами):

C:\cygwin64\bin\sh.exe -li  "%1"

Вопрос задавался раньше в нескольких местах; это может быть полезно:

Однако окно закроется, когда сценарий завершится - если только вы не сделаете это в сценарии, например, следуя за ним с помощью команды read (поскольку ассоциация передает сценарий только в качестве аргумента). Вот несколько дискуссий по этому аспекту:

4

Я был недоволен другими ответами, найденными здесь и в других местах в Интернете, поэтому я потратил значительное количество времени на то, чтобы понять, как это сделать правильно. Вот что я придумала.

  1. Создайте ключ с именем .sh и установите для него значение (Default) Shell Script в HKEY_CLASSES_ROOT .
    • Создайте ключ с именем Shell Script в HKEY_CLASSES_ROOT и установите значение (Default) в Shell Script .
  2. Создайте ключ с именем shell в HKEY_CLASSES_ROOT\Shell Script .
  3. Создайте ключ с именем open в HKEY_CLASSES_ROOT\Shell Script\shell и установите значение (Default) на Run with Cygwin .
  4. Создайте ключ с именем 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" (изменение C:\cygwin64\ to C:\cygwin\ если вы используете 32-битную версию).

Теперь вы можете просто дважды щелкнуть по файлу .sh, и он будет работать так, как вы ожидаете.

Бонус:

  1. Создайте ключ с именем DefaultIcon в HKEY_CLASSES_ROOT\Shell Script и установите значение (Default) в %SystemRoot%\System32\imageres.dll,-68 . Это приведет к применению стандартного значка Batch-файла к вашим сценариям оболочки.

Я также создал файл исправления реестра (Сохранить как 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\""
0

Поместите следующее в пакетный файл и выберите его для "Opens with" для «.sh»:

@echo off
C:\cygwin\bin\bash.exe -lc "cd ""%cd%""; ""$(cygpath -u "%1")"""

'Cd ""% cd% "";' part гарантирует, что скрипт оболочки всегда будет запускаться в том же каталоге, из которого он был вызван, даже если ваш профиль Bash пытается запуститься в вашем домашнем каталоге. Несколько слоев двойных кавычек необходимы, чтобы избежать обратной косой черты и пропусков в именах путей.

Альтернативой опции входа в систему (-l) для обеспечения доступности не встроенных команд является добавление каталога bin в ваш путь:

@echo off
set path=%path%;C:\cygwin\bin
bash -c """$(cygpath -u "%1")"""
0

В конце концов я обнаружил, что это лучшее решение на моей машине с Windows 7.

1.Перейдите в "Control Panel" > "Default Programs" > "Set Associations" и свяжите файл .sh заканчивающийся c:\cygwin\bash.exe

2.Откройте regedit и перейдите к HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command и измените его на "C:\cygwin\bin\bash.exe" -li "%1"

Найдено здесь https://stackoverflow.com/a/106325/1612318 (комментарий Матиаса)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .