Запустите .sh файл при двойном щелчке на Windows с Cygwin

16649
Rotareti

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

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

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

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

6

4 ответа на вопрос

7
Thomas Dickey

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

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

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

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

Где именно вы устанавливаете эту ассоциацию? Я нахожусь на Windows 10 и, похоже, только сможет связать программу с расширением файла, но не добавление / редактирование параметров, которые будут использоваться. Totte Karlsson 6 лет назад 0
Некоторые спрашивали это [здесь] (https://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings-winpc/file-associations-and-parameter-passing/2cc65f1a-6f45-4091-a027-5d77c99877e8 ). [This] (https://superuser.com/questions/136133/how-do-i-set-advanced-file-associations-in-windows-7) похож, но старше. Thomas Dickey 6 лет назад 0
4
Drew Chapin

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

  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\на, 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
Rotareti

In the end I found this to be the best solution on my Windows 7 machine.

1.Go to "Control Panel" > "Default Programs" > "Set Associations" and associate .sh file ending with c:\cygwin\bash.exe

2.Open regedit and go to HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command and change it to "C:\cygwin\bin\bash.exe" -li "%1"

Found here https://stackoverflow.com/a/106325/1612318 (Matthias' comment)

0
Jeffrey Magedanz

Put the following in a batch file, and select it for "Opens with" for ".sh" files:

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

The 'cd ""%cd%"";' part ensures that the shell script will always start in the same directory from which it was called, even if your Bash profile tries to start in your home directory. The multiple layers of double quotes are necessary to escape backslashes and allow for spaces in path names.

An alternative to the login (-l) option, for making sure non-builtin commands are available, is to add the bin directory to your path:

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