Как я могу связать .sh файлы с Cygwin? - PullRequest
48 голосов
/ 20 сентября 2008

Я бы хотел запустить длинную команду rsync в Cygwin, дважды щелкнув файл .sh в Windows. Он должен начинаться в каталоге, содержащем файл (например, / cygdrive / c / scripts /), чтобы относительные пути работали. Кто-нибудь заставил это работать?

Примечание: я только что нашел здесь , пакет Cygwin, который управляет контекстными меню Windows (Bash Prompt Here). Может быть, есть подсказки.

Ответы [ 13 ]

41 голосов
/ 20 сентября 2008

Хорошо, я нашел что-то, что работает. Связывание пакетного файла, как предположил Владимир, не сработало, но аргументы bash были ключевыми.

Коротко и приятно: свяжите с этой командой: "C: \ cygwin \ bin \ bash.exe" -li "% 1"% *

Длинная версия, если вы не знаете, как:

  1. В проводнике перейдите в Инструменты / Параметры папки / Типы файлов.
  2. У меня уже была запись SH для Bash Script. Если у вас его нет, нажмите «Создать» и введите «SH», чтобы создать его.
  3. Выбрав расширение SH, нажмите Дополнительно.
  4. Выберите действие «Открыть» и нажмите «Изменить» (или создайте действие).
  5. Эта команда используется: "C: \ cygwin \ bin \ bash.exe" -li "% 1"% *. Обратите внимание, что без -li в моих сценариях повторялась «команда не найдена».

Вы также можете добавить SH в переменную среды PATHEXT :

WinKey + Пауза / Дополнительно / Переменные среды / Системные переменные / PATHEXT

Спасибо за вашу помощь, ребята!

15 голосов
/ 07 марта 2009

Вот мое решение. Это хорошо работает для моих * .sh скриптов независимо от того, где они находятся в иерархии каталогов. Обратите внимание, что перед вызовом я перехожу к dirname cygpath удар по cygpath. Это просто работает.

assoc .sh=bashscript

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"'
6 голосов
/ 29 апреля 2010

Я уже некоторое время работаю с решением Dragos и считаю его лучшим, потому что оно исключает необходимость использования «cygpath -u» в ваших сценариях оболочки.

Затем я захотел иметь дополнительные функции, такие как поддержка перетаскивания для файлов .sh и .bash. После нескольких копаний я написал .bat, который связывает файлы .sh и .bash как «bashscript» и активирует для них обработчик перетаскивания в проводнике Windows. Мне пришлось отредактировать команду Драгоса, чтобы он обрабатывал 1 аргумент (путь к элементу, опущенному в сценарии оболочки).

Файл .bat примерно выглядит следующим образом:

echo Registering .sh and .bash files as "bashscript"...
assoc .sh=bashscript
assoc .bash=bashscript
echo.
echo Setting the run command for the file type "bashscript"...
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"'
echo.
echo Activating the drag^&drop capability for "bashscript" files (only 1 dropped item
echo will be passed to the script, multiple items are not supported yet)...
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f

Сценарий "argshandler.sh" в корне Cygwin просто отправляет cygpath первый полученный аргумент и ничего не делает, если его нет (например, если вы просто дважды щелкнете по файлу скрипта):

#!/bin/bash
if [ ! "$1" == "" ]
then
    cygpath -u "$1"
fi

Пока все это работает довольно хорошо. Тем не менее, есть некоторые недостатки, которые было бы неплохо устранить:

  • Команда Dragos и моя производная от нее терпят неудачу, когда дело доходит до сценариев, которые расположены на путях UNC, например \\ MyServer \ MyShare \ scriptfile.sh
  • Только 1 отброшенный предмет будет передан в скрипт оболочки.

Каким-то образом, что касается проблемы 1-drop-item-only, изменение сценария обработчика аргумента для возврата что-то вроде

"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"

и изменение установщика команды Dragos на что-то вроде

...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'

(обратите внимание, что "" вокруг части argshandler.sh пропало), похоже, не работает должным образом: если некоторые элементы, перетаскиваемые в сценарий, содержат пробелы в пути, указанные пути будут разбиты на несколько аргументов на пробелах, хотя каждый из них заключен в двойные кавычки ... странно.

Есть ли профессионалы командной строки, которые решили решить одну или обе эти проблемы?

2 голосов
/ 14 августа 2015

Я использую команду:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

Он запускает его в mintty, развернуто, устанавливает заголовок окна для запускаемого скрипта (путь к нему в Windows), меняет каталог на тот, где находится скрипт, запускает его и остается открытым после его завершения.

В качестве альтернативы, это установит заголовок пути к сценарию cygwin:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%1")\007" && cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

Пакетные скрипты для установки связи для вас:

Путь Windows в заголовке:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause

И путь cygwin в заголовке:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%%1")\007" ^&^& cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause
2 голосов
/ 20 сентября 2008

Это не связывает .sh файлы, но может дать вам то, что вы хотите. Я начал с командного файла cygwin.bat, который запускает оболочку Cygwin bash, и изменил его так:

$ cat test.bat
@echo off

set MYDIR=C:\scripts

C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15"

Это игрушечный скрипт, но вы можете изменить его так, чтобы он вызывал rsync или вызывал отдельный скрипт оболочки. Я признаю, что было бы лучше, если бы в нем не было жесткого кодирования MYDIR. Есть вероятный способ заставить это автоматически установить это.

О да, когда я создал файл .bat в оболочке bash в Cygwin, я заметил, что мне нужно было на самом деле «chmod + x test.bat», прежде чем я смог запустить его двойным щелчком мыши. Я думаю, что это установка разрешений NTFS. Вам не нужно было бы этого делать, если вы просто использовали блокнот.

1 голос
/ 11 сентября 2018

После осмотра разных мест. Что мне удалось сделать, так это сначала выбрать C:\cygwin64\bin\mintty.exe в диалоговом окне «Открыть с помощью ...» Затем отредактируйте значение реестра

[Computer\HKEY_CLASSES_ROOT\Applications\mintty.exe\shell\open\command]

до

C:\cygwin64\bin\mintty.exe -t "%1" /bin/bash -l -i -c "v1=\"$(cygpath -u \"%0\" -a)\" && v2=\"$(dirname \"$v1\")\" && cd \"$v2\" ; exec bash  \"%1\" %*"  
1 голос
/ 07 июля 2011
    Windows Registry Editor Version 5.00
    ;File:ConfigureShToBeRunUnderExplorer.reg v:1.0 docs at the end
    [HKEY_CLASSES_ROOT\Applications\bash.exe] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command]
    @="C:\\cygwin\\bin\\bash.exe -li \"%1\" %*"

    ; This is a simple registry file to automate the execution of sh via cygwin on windows 7, might work on other Windows versions ... not tested 
    ; you could add this setting by issueing the following command: reg import ConfigureShToBeRunUnderExplorer.reg 
    ; Note the path of your bash.exe
    ; Note that you still have to add the .sh to your %PATHTEXT%
            ; usage: double - click the file or reg import file 
1 голос
/ 20 сентября 2008

Вы должны иметь возможность ассоциировать файлы .sh с \ CYGWIN \ usr \ bin \ bash.exe. Скрипт должен будет изменить свой собственный рабочий каталог, я предлагаю разместить что-то вроде этого вверху:

cd `dirname "$0"`
0 голосов
/ 15 июля 2014

Я самостоятельно разработал сценарий .bat (не основанный на ответах других), чтобы связать тип файла (например, * .cygwin) для открытия с этим .bat следующим образом:

=== файл run-script-with-Cygwin-in-same-dir.bat ===

@echo off
REM   Info: A script created by Johnny Wong.  (last modified on 2014-7-15)
REM   It is used to pass a file argument to run a bash script file.  The current directory is setting to the path of the script file for convenience.
REM   Could be copied to C:\cygwin;  and then you manually associate .cygwin file extension to open with this .bat file.
set CYGWIN=nodosfilewarning

C:\cygwin\bin\bash --login -i -c 'cd "`dirname "%~1"`"; exec bash "%~1" %2 %3 %4 %5 %6 %7 %8 %9'

REM finally pause the script (press any key to continue) to keep the window to see result
pause

=== файл run-script-with-Cygwin-in-same-dir.bat ===

Подробные пояснения по используемому синтаксису (если вы заинтересованы):

  1. % 1 заключено в кавычки "...", если связано с открытием файла с этим .bat. Для перетаскивания файла в этот .bat, он "..." заключен в кавычки, только если путь к файлу имеет пробелы.
  2. % ~ 1 совпадает с% 1 с удалением окружающих двойных кавычек, если они существуют
  3. чтобы удалить окружающие двойные кавычки из% p%, используйте for %%a in (%p%) do set p=%%~a
  4. вы должны использовать "%~1", чтобы принудительно вводить путь к файлу сценария в двойных кавычках, чтобы разделители папок '\' (в% 1) не удалялись bash при обработке как escape-символов. В противном случае он не работает при перетаскивании файла, в котором нет пробелов, на этот .bat.
  5. "exec bash" может быть просто "bash", первый - для экономии ресурсов для еще одного процесса bash.

Наслаждается:)

0 голосов
/ 04 марта 2010

Я использую PuttyCyg (потрясающая замазка в окне Cygwin), вот как это все сделать:

Создать пакетный скрипт, например. на моей машине я использовал

C:\Dev\scripts\cygbashrun.bat

с содержанием

SET CYGWIN=nodosfilewarning
C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1

Очевидно, адаптироваться, чтобы содержать пути вашей установки PuttyCyg.

Затем в проводнике Windows перейдите в Инструменты - Параметры папки - Типы файлов

Создайте запись ".sh", если ее еще нет (или .bash в зависимости от того, что вам нравится в ваших скриптах) .. затем Advanced ..

[необязательный шаг] измените значок и выберите значок Cygwin из вашей установки

Тогда:

  1. Новый ..
  2. Action = Запустить Bashscript ..
  3. Приложение, используемое для выполнения этого действия = C: \ Dev \ scripts \ cygbashrun.bat "% 1"

Работает как очарование для меня: O)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...