2008-09-19 15 views
43

Me gustaría ejecutar un comando rsync largo en Cygwin haciendo doble clic en un archivo .sh en Windows. Debe comenzar en el directorio que contiene el archivo (por ejemplo,/cygdrive/c/scripts /) para que las rutas relativas funcionen. Alguien consiguió esto para trabajar?¿Cómo puedo asociar archivos .sh con Cygwin?

Nota: Acabo de encontrar chere, un paquete de Cygwin que gestiona los menús contextuales de Windows (Bash Prompt Here). Puede tener algunas pistas.

Respuesta

38

Ok, he encontrado algo que funciona Asociar un archivo por lotes como sugirió Vladimir no funcionó, pero los argumentos bash fueron clave.

corto y dulce: asociado con este comando: "C: \ cygwin \ bin \ bash.exe" -li "% 1" % *

Versión larga si no se como:

  1. En Explorer, vaya a Herramientas/Opciones de carpeta/Tipos de archivo.
  2. Ya tenía una entrada SH para Bash Script. Si no tiene uno, haga clic en Nuevo e ingrese "SH" para crear uno.
  3. Con la extensión SH seleccionada, haga clic en Avanzado.
  4. Elija la acción "abrir" y haga clic en editar (o cree la acción).
  5. Este es el comando a usar: "C: \ cygwin \ bin \ bash.exe" -li "% 1"% *.Tenga en cuenta que sin el -li, estaba escribiendo "comando no encontrado" en mis scripts.

También es posible que desee agregar SH a su PATHEXT variable de medio ambiente:

WinKey + Pausa/avanzadas Variables/Medio Ambiente/Variables del sistema/PATHEXT

Gracias por su ayuda, chicos !

+0

Si sus scripts no requieren interacción con la consola, puede ejecutarlos completamente sin ventanas utilizando cygwin's run.exe. Simplemente cambie el comando a 'C: \ cygwin \ bin \ run.exe" bash -li "% 1"% * ' –

+12

¿Alguien sabe cómo hacer esto en Windows 7? La opción" Tipos de archivo "parece que falta. – adib

+0

¿Hay alguna? ¿una forma de que se lance en la consola de Cygwin en lugar de la ridícula consola MS para que pueda hacer algo como copiar y pegar correctamente? –

0

Una solución que funciona es crear un archivo .bat que abrirá cygwin y ejecutará su script.

La secuencia de comandos para ejecutar el script go.sh se encuentra en mi directorio home:

@echo off 

C: 
chdir C:\cygwin\bin 

bash --login -i ./go.sh 
1

usted debería ser capaz de asociar los archivos .sh con \ CYGWIN \ usr \ bin \ bash.exe. La secuencia de comandos tendrá que cambiar su propio directorio de trabajo, sugiero que se pega algo como esto en la parte superior:

cd `dirname "$0"` 
+0

El $ 0 es una buena idea, tal vez, pero no funciona para mí. Aparece un error en la línea 1: dirname: comando no encontrado. – Jerph

+0

Para que el comando 'dirname' funcione, por favor agregue cygwin \ bin dir al PATH – yvolk

2

Esto no asocia archivos .sh, pero podría conseguir lo que quiere. Empecé con el archivo por lotes cygwin.bat que lanza el shell bash Cygwin, y lo modificó así:

$ cat test.bat 
@echo off 

set MYDIR=C:\scripts 

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

Eso es un script de juguete pero se puede modificar para llamar a rsync o llamar a un script de shell separada. Admito que sería mejor si no tuviera el código MYDIR codificado. Probablemente hay una forma de hacerlo para configurarlo automágicamente.

Oh sí, cuando creé el archivo .bat en un shell bash en Cygwin, noté que tenía que realmente "chmod + x test.bat" antes de poder iniciarlo con un doble clic. Creo que está configurando permisos NTFS. No necesitarías hacer eso si solo usaras el bloc de notas.

+0

Sí, codificar el MYDIR es una especie de no iniciador porque quiero que otros miembros del equipo puedan usar el mismo script. ¿Alguien puede "configurarlo automágicamente"? Si es así, esto parece ser el boleto. En este punto, parece que necesitamos experiencia en scripts de DOS ... – Jerph

0

Mire los comandos assoc y ftype en un cuadro de dos. He aquí un ejemplo de .jpg en mi 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" 

Asegúrese de cambiar la ruta para golpear en el comando ftype para que coincida donde tiene cygwin instalado

+0

Lo siento, esos comandos no me funcionaron. – Jerph

14

Aquí está mi solución. Funciona bien para mis scripts * .sh independientemente de dónde se encuentren en la jerarquía del directorio. Observe que cd al dirname de cygpath antes de llamar al bash en el cygpath. Simplemente funciona.

assoc .sh=bashscript 

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

Creo que esta es una buena respuesta, pero no tengo 'assoc' o' ftpye' en mi camino. ¿Lo hago desde un prompt de DOS? –

+0

Sí. En Win XP, start-> run cmd. –

+0

Tengo un combo de la solución de Dragos's of Jerph funcionando decentemente (ejecuto después de la asociación). Sin embargo, recibo una advertencia de ruta de MS-DOS y estoy pensando en cambiar a la solución de Dragos. Sin embargo, existe el% * que falta al final que (creo) permite que los argumentos pasen a sh scripts. Cualquier razón para no cambiar la última parte del guión de Dragos a: <...; bash "$ (cygpath -u"% 1 ")"% * '>? – Magnus

0

I just did not molestar. Asocié archivos .sh con Crimson Editor (ya que dedico tanto tiempo a resolver los errores como lo hago al ejecutarlos). Ahora se trata de obtener la combinación correcta de "abrir con/editar con" para trabajar en Tipos de archivo> Avanzado. Si supiera qué código DDE utilizó Crimson Editor, eso facilitaría las cosas; a partir de este post no he podido encontrarlo, sin embargo.

Esto me recuerda a mis días de Mac (1993-2008) cuando solía probar y escanear aplicaciones para una gramática más que rudimentaria de AppleScript.

BZT

+1

Esto no responde exactamente la pregunta ... –

0

utilizo PuttyCyg (masilla impresionante en la ventana de Cygwin) aquí es cómo conseguir todo en marcha:

crear un script por lotes, por ejemplo. en mi máquina Solía ​​

C:\Dev\scripts\cygbashrun.bat 

con contenidos

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

Obviamente adaptarse a contener los caminos de su instalación de PuttyCyg.

A continuación, en Windows File Explorer vaya a Herramientas - Opciones de carpeta - Tipos de archivo

Crear una entrada de ".sh" si no hay ya (o .bash dependiendo de lo que le gusta las secuencias de comandos para tener). . .. luego Avanzado

[paso opcional] cambiar el icono y seleccione el icono de su instalación de Cygwin

continuación:

  1. Nueva ..
  2. Action = Ejecutar Bashscript ..
  3. Aplicación utilizada para realizar esta acción = C: \ Dev \ scripts \ cygbashrun.bat "% 1"

funciona como un encanto para mí: O)

6

He estado trabajando con la solución de Dragos desde hace un tiempo y la considero la mejor porque elimina la necesidad de usar "cygpath -u" dentro de los scripts de tu shell.

Luego quería tener características adicionales como arrastrar & soltar soporte para archivos .sh y .bash. Después de investigar un poco, escribí un .bat que asocia archivos .sh y .bash como "bashscript" y activa el Explorador de Windows para que los arrastre &. Tuve que editar el comando de Dragos para que manejara 1 argumento (la ruta al elemento caído en un script de shell).

El archivo .bat va más o menos de la siguiente manera:

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 

El script "argshandler.sh" en la raíz de Cygwin solo cygpaths volver al primer argumento que recibe y nada en absoluto si no hay ninguno (son por ejemplo, si solo hace doble clic en un archivo de script):

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

Todo esto funciona bastante bien hasta el momento. Sin embargo, todavía hay algunos inconvenientes que sería bueno que resolver:

  • comando Dragos' y mi derivado de ella fallar cuando se trata de secuencias de comandos que se encuentran en las rutas UNC, por ejemplo \\ myserver \ myshare \ scriptfile.sh
  • Solo 1 elemento eliminado se pasará al script de shell.

De alguna manera, en relación con la 1-ítems lanzadas desde el único problema, cambiando el guión manejador argumento de devolver algo así como

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

y cambiando el colocador de mando Dragos' a algo como

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

(tenga en cuenta que el "" alrededor de la parte argshandler.sh se ha ido) no parece funcionar correctamente: si algunos de los elementos arrastrados a un script contienen un espacio en blanco en su ruta, dichos caminos se dividirán en múltiples argume nts en los espacios en blanco a pesar de que cada uno de ellos está entre comillas dobles ... raro.

¿Hay algún profesional de línea de comando que se sienta capaz de resolver uno o ambos problemas?

1
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 
0

he desarrollado un script de .bat en mi propia (no originado a partir de la respuesta de la otra) para asociar un tipo de archivo (por ejemplo, * .cygwin) para abrir con esta .bat, de la siguiente manera:

== = archivo de ejecución-script-con-Cygwin-en-misma-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 

archivo === run-escritura-con-Cygwin-en-misma-dir.bat

Explicaciones detalladas sobre la sintaxis utilizada (si usted está interesado):

  1. % 1 es "..." citado si se asocia un archivo para abrir con este .bat. Para arrastrar un archivo a este archivo .bat, se indica "..." solo si la ruta del archivo tiene espacios.
  2. % ~ 1 es igual a% 1 y la zona entre comillas dobles eliminados, si es que existen
  3. para eliminar rodea comillas dobles de% p%, utilice for %%a in (%p%) do set p=%%~a
  4. deberá utilizar "%~1" para forzar la trayectoria del archivo de script comillas dobles, para que sus separadores de carpetas '\' (en% 1) no sean eliminados por bash cuando se tratan como caracteres de escape. De lo contrario, no funciona al arrastrar un archivo, que no tiene espacios en su camino, a este .bat.
  5. "exec bash" puede ser solo "bash", el primero es para guardar recursos para un proceso de bash más.

Le gustan :)

1

Este es el comando que estoy 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")"' 

Se ejecuta en mintty, maximizada, establece el título de la ventana a la secuencia de comandos de ser RAN (ruta de Windows a it), cambia el directorio donde está el script, lo ejecuta y permanece abierto después de que se completa.

Alternativamente, esto hará que el título a la trayectoria cygwin a la secuencia de comandos:

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

secuencias de comandos por lotes para establecer la asociación para usted:

ruta de Windows en el 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 

And cygwin ruta en el 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 
Cuestiones relacionadas