Запустите файл.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
команда (поскольку ассоциация только передает сценарий в качестве аргумента). Вот несколько дискуссий по этому аспекту:
Я был недоволен другими ответами, найденными здесь и в других местах в Интернете, поэтому я потратил значительное количество времени на то, чтобы понять, как это сделать правильно. Вот что я придумала.
- Создать ключ с именем
.sh
и установить это(Default)
значение дляShell Script
подHKEY_CLASSES_ROOT
,- Создать ключ с именем
Shell Script
подHKEY_CLASSES_ROOT
и установите(Default)
значение дляShell Script
,
- Создать ключ с именем
- Создать ключ с именем
shell
подHKEY_CLASSES_ROOT\Shell Script
, - Создать ключ с именем
open
подHKEY_CLASSES_ROOT\Shell Script\shell
и установить(Default)
значение дляRun with Cygwin
, - Создать ключ с именем
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, и он будет работать так, как вы ожидаете.
Бонус:
- Создать ключ с именем
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 действовал так, как если бы он был вызван как оболочка входа в систему (см. ПРИЗНАНИЕ ниже)