Запустіть .sh файл подвійним клацанням на Windows із Cygwin


8

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

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

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

Але як мені сказати Windows запускати такі файли .sh?

Відповіді:


8

Ви повинні додати %1параметр, щоб зв'язати роботу асоціації, наприклад, наприклад, такий (лапки потрібні для роботи зі шляхами, що мають вбудовані пробіли):

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

Питання задавались раніше в декількох місцях; вони можуть бути корисними:

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


Де саме ви налаштовуєте це об’єднання? Я в Windows 10 і, здається, зможу асоціювати програму лише з розширенням файлу, але не додаючи / редагуючи параметри, які слід використовувати.
Тотте Карлссон

Деякі запитували це тут . Це схоже, але старше.
Томас Дікі

4

Я був незадоволений іншими відповідями, знайденими тут і деінде в Інтернеті, тому витратив чимало часу на те, щоб правильно це зробити. Ось що я придумав.

  1. Створіть ключ з ім'ям .shі встановіть його (Default)значення Shell ScriptUnder 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. Це застосує стандартний значок пакетного файлу до сценаріїв оболонки.

Я також створив файл виправлення реєстру (Зберегти як 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\""

2

Помістіть наступне у пакетному файлі та виберіть його для "Відкривається з" для ".sh" файлів:

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

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

Альтернативою параметру входу (-l), щоб переконатися, що невбудовані команди доступні, - додати каталог бін до вашого шляху:

@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 (коментар Маттіаса)


0

Я склав досить повне рішення для цього звідси та інших постів та джерел.

Збережіть як .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файлами в шляхах з пробілами.

  • Дозволяє клацнути правою кнопкою миші -> запустити як адміністратор.

  • Завершує вікно, коли закінчиться.

Єдиними обмеженнями є те, що параметри передаються неправильно, коли є пробіли, і перетягування та видалення файлу для проходження його шляху, оскільки параметр не працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.