Pergunta

Eu gostaria de executar um comando longo rsync em Cygwin clicando duas vezes sobre um arquivo .sh no Windows. Ele deve começar a conter o diretório do arquivo (por exemplo, / cygdrive / c / scripts /) para que caminhos relativos trabalho. Qualquer chegado a este trabalho?

Nota: Acabei de encontrar aqui , um pacote Cygwin que administra os menus de contexto do Windows (Bash Prompt aqui). Ele pode ter algumas pistas.

Foi útil?

Solução

Ok, eu encontrei algo que funciona. Associar um arquivo de lote como Vladimir sugeriu não funcionou, mas os argumentos festança foram fundamentais.

curta e doce: associado com este comando: "C: \ cygwin \ bin \ bash.exe" -li "% 1" % *

Versão longa se você não sabe como:

  1. No Explorer, vá em Ferramentas / Opções de Pasta / Tipos de arquivo.
  2. Eu já tinha uma entrada SH para Bash Script. Se você não tiver um, clique em Novo e digite "SH" para criar um.
  3. Com a extensão SH selecionado, clique em Avançado.
  4. Escolha a ação "aberta" e clique em editar (ou criar a ação).
  5. Este é o comando para uso: "C: \ cygwin \ bin \ bash.exe" -li "% 1" % * . Note-se que sem a -li , foi returing "comando não encontrado" em meus scripts.

Você também pode querer adicionar SH para a sua PATHEXT variável de ambiente:

WinKey + Pause / Avançado / Variáveis ??de Ambiente / Variáveis ??de Sistema / PATHEXT

Obrigado por sua ajuda, rapazes!

Outras dicas

Aqui está a minha solução. Ele funciona bem para meus scripts * .sh independentemente de onde eles estão na hierarquia de diretórios. Observe que eu mude para o dirname cygpath antes de chamar festa na cygpath. Ele simplesmente funciona.

assoc .sh=bashscript

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

Eu tenho trabalhado com solução Dragos' já há algum tempo e eu considerá-lo como o melhor, porque eleminates a necessidade de usar 'cygpath -u' dentro de seus scripts shell.

Então eu queria ter recursos adicionais como drag & drop suporte para .sh e arquivos .bash. Depois de algumas escavações em torno Eu escrevi um .bat que associa .sh e arquivos .bash como "bashscript" e ativa o drag & drop manipulador Windows Explorer para eles. Eu tinha de comando Editar Dragos' para torná-lo lidar com um argumento (o caminho para o item caiu em um script shell).

O arquivo .bat ou menos é o seguinte:

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

O script "argshandler.sh" na raiz Cygwin apenas cygpaths apoiar o primeiro argumento que recebe e nada se não houver qualquer (por exemplo, se você basta clicar duas vezes em um arquivo de script):

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

Tudo isso workes muito bem até agora. No entanto, ainda existem alguns inconvenientes que seria bom ser resolvidos:

  • comando Dragos' e meu derivado dele falhar quando se trata de scripts que estão localizados em caminhos UNC, por exemplo, \\ myserver \ myshare \ scriptfile.sh
  • Apenas 1 caiu item será passado para o shell script.

De alguma forma, sobre o 1-cair-item-único problema, mudando o script manipulador de argumento para devolver algo como

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

e alterando o setter de comando Dragos' para algo como

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

(note que o "" em torno da parte argshandler.sh se foram) parece não funcionar corretamente: Se alguns dos itens arrastados para um script contêm um espaço em branco em seu caminho, disse caminhos serão divididos em vários argumentos para os espaços em branco, mesmo que cada um deles está entre aspas ... estranho.

Existem profissionais de linha de comando que se sentem até ele para resolver uma ou ambas estas questões?

Este faz arquivos .sh não associados, mas pode conseguir o que você quer. Comecei com o arquivo de lote cygwin.bat que inicia o shell bash Cygwin, e modificou-lo assim:

$ cat test.bat
@echo off

set MYDIR=C:\scripts

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

Isso é um script brinquedo, mas você pode modificá-lo para chamar rsync ou chamar um script shell separado. Admito que seria melhor se ele não tivesse MYDIR codificado. Há probaby uma maneira entendi para definir automagicamente isso.

Oh yeah, quando eu criei o arquivo .bat em um shell bash no Cygwin, percebi que eu tinha que realmente "chmod + x test.bat" antes que eu pudesse lançá-lo com um clique duplo. Eu acho que é configuração NTFS permissões. Você não precisa fazer isso bloco de notas se você acabou de usar.

Este é o comando que estou usando:

"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")"'

Ele executa em mintty, maximizada, define o título da janela ao ser correu roteiro (caminho do Windows para ele), muda diretório para onde o script é, executa e fica aberto após completar.

Como alternativa, isso vai definir o título para o caminho cygwin para o 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")"'

scripts em lotes para definir a associação para você:

caminho do Windows em título:

@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

E cygwin caminho no título:

@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

Você deve ser capaz de associar arquivos .sh com \ CYGWIN \ usr \ bin \ bash.exe. O script terá que mudar seu diretório de trabalho, sugiro que adere algo parecido com isso no topo:

cd `dirname "$0"`
    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 

Depois de olhar em torno de lugares diferentes. O que eu consegui chegar é, primeiro selecione C:\cygwin64\bin\mintty.exe das janelas "Abrir com ..." diálogo Em seguida, edite o valor de registo de

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

para,

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

Uma solução que funciona é criar um arquivo .bat que irá abrir cygwin e executar o seu script.

O script para executar o go.sh script localizado no meu diretório home:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh

Eu só não se incomodou. I associado arquivos .sh com Crimson Editor (desde que eu gastar tanto tempo trabalhando fora os bugs como eu realmente executá-los). Agora é uma questão de obter o direito "abrir com / edição com" combinação de trabalho em Tipos de Arquivo> Avançado. Se eu soubesse o código DDE carmesim editor usado, que tornaria as coisas mais fáceis; a partir deste post eu não tenho sido capaz de encontrá-lo, no entanto.

Isso me faz lembrar de meus dias Mac (1993-2008) quando eu usei para tentar aplicações de digitalização para mais de rudimentar scriptability AppleScript.

BZT

Eu uso PuttyCyg (arremate incrível na janela Cygwin) aqui é como começar tudo vai:

Criar um script em lotes, por exemplo. na minha máquina eu usei

C:\Dev\scripts\cygbashrun.bat

com conteúdos

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

Obviamente adaptar para conter os caminhos da sua instalação de PuttyCyg.

Então, em arquivo Windows Explorer, vá em Ferramentas - Opções de Pasta - Tipos de Arquivo

Criar uma entrada de "sh" se já não é (ou .bash dependendo do que você gosta de seus scripts para ter) .. então avançado ..

[passo opcional] alterar o ícone e selecione o ícone Cygwin a partir de sua instalação

Depois:

  1. New ..
  2. Action = Run Bashscript ..
  3. Aplicação utilizada para executar esta ação = C: \ Dev \ Scripts \ cygbashrun.bat "% 1"

funciona como um encanto para mim: O)

Eu desenvolvi um script .bat no meu próprio (não originado de resposta do outro) para associar um tipo de arquivo (por exemplo * .cygwin) para abrir com este .bat, como segue:

=== arquivo run-script-com-Cygwin-in-mesmo-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

=== arquivo run-script-com-Cygwin-in-mesmo-dir.bat ===

explicações detalhes sobre sintaxe usados ??(se você estiver interessado):

  1. % 1 é "..." citado se associado um arquivo para abrir com este .bat. Para arrastar um arquivo para este .bat, é "..." citado somente se o caminho do arquivo tem espaços.
  2. % ~ 1 é o mesmo que% 1 com áreas aspas eliminado, se existirem
  3. para remover circundante aspas de% p%, o uso for %%a in (%p%) do set p=%%~a
  4. você deve usar "%~1" para forçar o caminho do arquivo de script entre aspas, para que seus separadores pasta '\' (em% 1) não será removido pelo bash quando está sendo tratada como caracteres de escape. Caso contrário, ele não funciona ao arrastar um arquivo, que não tem espaços em seu caminho, a este .bat.
  5. "bash exec" pode ser apenas "bash", o primeiro é para poupar recursos para um processo mais bash.

Gosta de:)

Olhe para os comandos assoc e FTYPE em um dos caixa. Aqui está um exemplo para .jpg na minha máquina

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"

Certifique-se de alterar o caminho para bater no ftype comando para combinar onde você tem cygwin instalado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top