Подтвердить что ты не робот

Как я могу связать файлы .sh с Cygwin?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

WinKey + Пауза/Расширенные/Среда Переменные/Системные переменные /PATHEXT

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

Ответ 2

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

assoc .sh=bashscript

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"'

Ответ 3

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

Затем я хотел иметь дополнительные функции, такие как drag & drop support.sh и .bash. После некоторого копания я написал файл .bat, который ассоциирует файлы .sh и .bash как "bashscript" и активирует обработчик перетаскивания и удаления Windows Explorer для них. Мне пришлось отредактировать команду Dragos, чтобы она обрабатывала 1 аргумент (путь к элементу, сброшенному на оболочке script).

Файл .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" script в корне Cygwin просто передает путь к первому аргументу, который он получает, и ничего вообще, если их нет (например, если вы просто дважды щелкните файл script):

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

Все это до сих пор хорошо. Тем не менее, есть еще некоторые недостатки, которые приятно было бы решить:

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

Как-то, в отношении проблемы с 1-упавшим элементом, смена обработчика аргументов script, чтобы вернуть что-то вроде

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

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

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

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

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

Ответ 4

Это не связывает файлы .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"

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

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

Ответ 5

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

cd `dirname "$0"`

Ответ 6

    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 

Ответ 7

Это команда, которую я использую:

"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, максимизируется, устанавливает заголовок окна для запуска script (путь к нему Windows), меняет каталог, где находится script, запускает его и остается открытым после его завершения.

В качестве альтернативы это установит заголовок для пути cygwin к script:

"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

Ответ 8

Одно из решений, которое работает, - создать файл .bat, который откроет cygwin и выполнит ваш script.

script выполнить script go.sh, расположенный в моем домашнем каталоге:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh

Ответ 9

Посмотрите команды assoc и ftype в поле dos. Вот пример для .jpg на моей машине

c:\>assoc .jpg
.jpg=jpegfile

c:\>ftype jpegfile
jpegfile="C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1"

assoc .sh=bashscript

ftype bashscript="c:\cygwin\bin\bash.exe" "%1"

Убедитесь, что вы изменили путь к bash в команде ftype, чтобы указать, где вы установили cygwin

Ответ 10

Я просто не беспокоился. Я ассоциировал файлы .sh с Crimson Editor (так как я трачу столько времени на исправление ошибок, как я их фактически запускаю). Теперь вам нужно получить правильную комбинацию "открыть с /edit with" для работы в "Типы файлов" > "Дополнительно". Если бы я знал, какой код DDE-кода используется Crimson Editor, это упростит ситуацию; на этом посту я не смог его найти.

Это напоминает мне мои дни Mac (1993-2008), когда я пытался проверять приложения на более чем рудиментарную возможность написания AppleScript.

БЗТ

Ответ 11

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

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

C:\Dev\scripts\cygbashrun.bat

с содержимым

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

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

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

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

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

Тогда:

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

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

Ответ 12

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

=== file 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

=== file run- script -with-Cygwin-in-same-dir.bat ===

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

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

Наслаждайтесь:)