son qué mac los extensión ejecutar desinstalar correr con como archivos archivo abrir windows bash cygwin

windows - qué - ¿Cómo puedo asociar archivos.sh con Cygwin?



qué son los archivos con extensión sh (12)

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?

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


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 la secuencia de comandos que se ejecuta (ruta de acceso de Windows), cambia el directorio donde está la secuencia de comandos, la ejecuta y permanece abierta 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 establecer 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 cygwin camino 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. La secuencia de comandos tendrá que cambiar su propio directorio de trabajo; sugiero que coloque algo así en la parte superior:

cd `dirname "$0"`


Esto no asocia archivos .sh, pero puede obtener lo que desea. Empecé 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 podrías modificarlo para llamar a rsync o llamar a un script de shell separado. 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 lanzarlo con un doble clic. Creo que está configurando permisos NTFS. No necesitarías hacer eso si solo usaras el bloc de notas.


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

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

@echo off C: chdir C:/cygwin/bin bash --login -i ./go.sh


Aquí está mi solución. Funciona bien para mis scripts * .sh, independientemente de dónde se encuentren en la jerarquía del directorio. Tenga en cuenta que cd al dirname cygpath antes de llamar a bash en 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")"''


Simplemente no me molesté. 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 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


Yo uso PuttyCyg (increíble masilla en la ventana de Cygwin) así es cómo hacerlo funcionar:

Crear un script por lotes, ej. en mi máquina que utilicé

C:/Dev/scripts/cygbashrun.bat

con contenido

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

Obviamente adaptarse para contener las rutas de su instalación de PuttyCyg.

Luego, en Windows File Explorer, vaya a Herramientas - Opciones de carpeta - Tipos de archivos

Cree una entrada ".sh" si aún no existe (o .bash dependiendo de lo que le gusten sus scripts) ... entonces Avanzado ...

[paso opcional] cambie el ícono y seleccione el icono de Cygwin de 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"

Funciona como un encanto para mí: O)


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

Luego quería tener características adicionales como soporte para 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 de Windows Explorer para ellos. 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 aproximadamente va 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 simplemente devuelve el primer argumento que recibe y nada en absoluto si no hay ninguno (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 ahora. Sin embargo, todavía hay algunos inconvenientes que sería bueno resolver:

  • El comando de Dragos y mi derivado fallan cuando se trata de scripts que están ubicados en rutas UNC, por ejemplo, // miservidor / myshare / scriptfile.sh
  • Solo 1 elemento descartado se pasará al script de shell.

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

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

y cambiando el colocador del comando de Dragos a algo así 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 argumentos 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?


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: asociar con este comando: "C: / cygwin / bin / bash.exe" -li "% 1"% *

Versión larga si no sabes cómo:

  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 crear 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.

Es posible que también desee agregar SH a su variable de entorno PATHEXT :

WinKey + pausa / avanzado / variables de entorno / variables del sistema / PATHEXT

¡Gracias por su ayuda chicos!


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

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

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

Explicaciones detalladas sobre la sintaxis utilizada (si 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 lo mismo que% 1 con las comillas dobles circundantes eliminadas, si existen
  3. para eliminar las comillas dobles circundantes de% p%, usar for %%a in (%p%) do set p=%%~a
  4. debe usar "%~1" para forzar la ruta del archivo de script con comillas dobles, de modo que sus separadores de carpeta ''/' (en% 1) no sean eliminados por bash cuando sean tratados 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.

Disfruta :)


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


Mira los comandos de assoc y ftype en una caja 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úrese de cambiar la ruta de bash en el comando ftype para que coincida con la ftype cygwin