Pregunta

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 (p. ej./cygdrive/c/scripts/) para que funcionen las rutas relativas.¿Alguien consiguió que esto funcionara?

Nota:acabo de encontrar aquí, un paquete Cygwin que administra los menús contextuales de Windows (indicador Bash aquí).Puede que tenga algunas pistas.

¿Fue útil?

Solución

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

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

Versión larga si no sabes cómo:

  1. En el Explorador, 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 crear la acción).
  5. Este es el comando a utilizar: "C:\cygwin\bin\bash.exe" -li "%1" %*.Tenga en cuenta que sin el -li, estaba devolviendo "comando no encontrado" en mis scripts.

Quizás también quieras agregar SH para usted RUTA Variable ambiental:

WinKey+Pausa / Avanzado / Variables de entorno / Variables del sistema / RUTA

¡Gracias por su ayuda chicos!

Otros consejos

Aquí está mi solución.Funciona bien para mis guiones *.Sh, independientemente de dónde estén en la jerarquía de directorio.Tenga en cuenta que CD al Cygpath Dirname antes de llamar a 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")"'

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

Luego quise tener funciones adicionales como compatibilidad con arrastrar y soltar 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 controlador de arrastrar y soltar del Explorador de Windows para ellos.Tuve que editar el comando de Dragos para que manejara 1 argumento (la ruta al elemento colocado en un script de Shell).

El archivo .bat es aproximadamente el siguiente:

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 simplemente devuelve cygpath al primer argumento que recibe y nada en absoluto si no hay ninguno (p. ej.si simplemente hace doble clic en un archivo de script):

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

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

  • El comando de Dragos y mi derivado fallan cuando se trata de scripts que se encuentran en rutas UNC, p.\\miservidor\micompartido\scriptfile.sh
  • Solo se pasará 1 elemento eliminado al script de shell.

De alguna manera, con respecto al problema de solo 1 elemento eliminado, cambiar el script del controlador de argumentos para devolver algo como

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

y cambiando el configurador del comando de Dragos a algo como

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

(tenga en cuenta que los "" alrededor de la parte argshandler.sh han desaparecido) no parece funcionar correctamente:Si algunos de los elementos arrastrados a un script contienen un espacio en blanco en su ruta, dichas rutas se dividirán en múltiples argumentos en los espacios en blanco aunque cada uno de ellos esté entre comillas dobles...extraño.

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

Esto no asocia archivos .sh, pero puede brindarle lo que desea.Comencé con el archivo por lotes cygwin.bat que inicia el shell bash de Cygwin y lo modifiqué así:

$ cat test.bat
@echo off

set MYDIR=C:\scripts

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

Es un script de juguete, pero puede modificarlo para llamar a rsync o llamar a un script de shell independiente.Admito que sería mejor si no tuviera MYDIR codificado.Probablemente haya una manera de hacer que lo configure automáticamente.

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

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

Lo ejecuta en mintty, maximizado, establece el título de la ventana para el script que se está ejecutando (ruta de Windows), cambia el directorio donde está el script, lo ejecuta y permanece abierto una vez que se completa.

Alternativamente, esto establecerá el título de la ruta cygwin al 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 por lotes para configurar la asociación por 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

Y la ruta de cygwin 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

Debería poder asociar archivos .sh con \CYGWIN\usr\bin\bash.exe.El script tendrá que cambiar su propio directorio de trabajo, sugiero colocar algo como esto en la parte superior:

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 

Después de mirar por diferentes lugares.Lo que se me ocurrió es, primero seleccionar C:\cygwin64\bin\mintty.exe Desde el cuadro de diálogo "Abrir con ..." y luego edite el valor de registro de

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

a,

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

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

El script para ejecutar el script. go.sh ubicado en mi directorio de inicio:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh

Simplemente no me molesté.Asocié archivos .sh con Crimson Editor (ya que dedico tanto tiempo a solucionar los errores como a ejecutarlos).Ahora es cuestión de conseguir la combinación correcta "abrir con/editar con" para que funcione en Tipos de archivo>Avanzado.Si supiera qué código DDE utiliza Crimson Editor, haría las cosas más fáciles;Sin embargo, a partir de esta publicación no he podido encontrarlo.

Esto me recuerda mis días en Mac (1993-2008) cuando solía intentar escanear aplicaciones en busca de una capacidad de programación de AppleScript más que rudimentaria.

BZT

Yo uso PuttyCyg (increíble masilla en la ventana de Cygwin). Aquí se explica cómo hacerlo todo:

Cree un script por lotes, por ejemplo.en mi máquina usé

C:\Dev\scripts\cygbashrun.bat

con contenidos

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

Obviamente adáptese para contener las rutas de su instalación de PuttyCyg.

Luego, en el Explorador de archivos de Windows, vaya a Herramientas - Opciones de carpeta - Tipos de archivos

Cree una entrada ".sh" si aún no la hay (o .bash dependiendo de lo que le guste que tengan sus scripts).luego Avanzado..

[paso opcional] cambie el ícono y seleccione el ícono de Cygwin desde su instalación

Entonces:

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

A mí me funciona de maravilla :O)

Desarrollé un script .bat por mi cuenta (que no se originó a partir de la respuesta de otros) para asociar un tipo de archivo (p. ej.*.cygwin) para abrir con este .bat, de la siguiente manera:

=== archivo ejecutar-script-con-Cygwin-en-el-mismo-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 ejecutar-script-con-Cygwin-en-el-mismo-dir.bat ===

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

  1. %1 se cita "..." si está asociado un archivo para abrir con este .bat.Para arrastrar un archivo a este .bat, se cita "..." solo si la ruta del archivo tiene espacios.
  2. %~1 es igual que %1 sin las comillas dobles circundantes eliminadas, si existen
  3. para eliminar las comillas dobles circundantes de %p%, utilice for %%a in (%p%) do set p=%%~a
  4. debes usar "%~1" para forzar la ruta del archivo de script entre comillas dobles, de modo que bash no elimine sus separadores de carpeta '\' (en %1) cuando se traten como caracteres de escape.De lo contrario, no funciona al arrastrar un archivo, que no tiene espacios en su ruta, a este .bat.
  5. "exec bash" puede ser simplemente "bash", el primero sirve para ahorrar recursos para un proceso bash más.

disfruta :)

Mire los comandos assoc y ftype en un cuadro de dos.Aquí hay un ejemplo para .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úrate de cambiar la ruta para bash en el ftype comando para que coincida con donde tienes cygwin instalado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top