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

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

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

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

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

5 ответов

Решение

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

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

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

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

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

  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\""

Поместите следующее в пакетный файл и выберите его для "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")"""

Я собрал довольно полное решение для этого отсюда и другие посты и источники.

Сохраните как.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\\bash.exe\" -lic \"cd \\\"$(dirname \\\"$(cygpath -u \\\"%1\\\")\\\")\\\" ; ./$(basename \\\"$(cygpath -u \\\"%1\\\")\\\") %*\""

[HKEY_CLASSES_ROOT\Shell Script\shell\runas]
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Shell Script\shell\runas\command]
@="\"C:\\cygwin64\\bin\\bash.exe\" -lic \"cd \\\"$(dirname \\\"$(cygpath -u \\\"%1\\\")\\\")\\\" ; ./$(basename \\\"$(cygpath -u \\\"%1\\\")\\\") %*\""

Это использует C:\cygwin64\bin\bash.exeизмените путь на оба ключа, если это необходимо.

Это решение:

  • Работает с простым двойным щелчком мыши на любом исполняемом файле .sh файл.

  • Запускается из каталога .sh файл находится в.

  • Позволяет запустить любую команду, обычно в PATH в пределах .sh файл.

  • Не имеет проблемы с .sh файлы в путях с пробелами.

  • Позволяет щелкнуть правой кнопкой мыши -> запустить от имени администратора.

  • Закрывает окно, когда закончите.

Единственными ограничениями являются параметры, которые передаются неправильно, когда есть пробелы, и перетаскивание файла для передачи его пути в качестве параметра не работает.

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

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

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

Найдено здесь /questions/747271/kak-otpravit-ctrlaltdelete-v-windows-v-vmware-player/747291#747291 (комментарий Матиаса)

Самый простой способ, благодаря этому оригинальному комментарию, указанному в ответе Ротарети, упрощенному мной:

(Win10)
1. Создать любой .sh файл
2. Щелкните правой кнопкой мыши и выберите Open with..., Other Apps, Find Other App On This PC
3. Появится диалоговое окно. Введите в качестве имени файла следующее, включая кавычки:
"F:\cygwin64\bin\bash.exe" -li "%1"

сделанный! Отныне вы можете дважды щелкнуть .sh файлы для их выполнения в Cygwin.


Человек Баш:

Если указана опция -i, оболочка является интерактивной.

-l

Сделайте так, чтобы bash действовал так, как если бы он был вызван как оболочка входа в систему (см. ПРИЗНАНИЕ ниже)

Другие вопросы по тегам