make - how to run bash script in windows
¿Cygwin ejecutando script desde un archivo por lotes? (6)
¿Qué tipo de script shell? ¿Golpetazo? Si necesita ejecutar un script de bash, simplemente ejecútelo con bash.exe a través de un acceso directo. El objetivo sería algo como:
C:/cygwin/bin/bash.exe foo.bsh
La ruta a bash.exe dependerá de dónde se instaló cygwin. (No necesita la ruta en absoluto si el directorio bin está en su variable de entorno de ruta).
Puede hacer lo mismo en un script por lotes si lo desea. La línea de comando sería lo mismo que el "objetivo" anterior.
EDITAR BASADO EN COMENTARIOS (todavía asumiendo bash):
Ok, así que en su script por lotes (.bat) simplemente escriba:
bash.exe script.txt
Es posible que deba agregar la ruta a "bash.exe". Si no está seguro de dónde está "bash.exe", abra el archivo "Cygwin.bat" que mencionó en su pregunta. Debe tener la ruta en un comando chdir
. (Nota: Cygwin.bat solo ejecuta bash.exe en modo interactivo. Realmente no ejecuta nada llamado "cygwin".)
También deberá agregar la ruta a "script.txt" si no está en el mismo directorio que su script por lotes.
De nuevo, esto también funcionará en un acceso directo en lugar de un script por lotes.
Sé que cuando se instala Cygwin, hay un archivo por lotes que se utiliza para iniciarlo en Windows. Pero si quiero ejecutar un script sin iniciar Cygwin y hacer "./script"
¿Cómo creo un archivo por lotes para hacer eso?
Al igual que en ... solo tiene un archivo de proceso por lotes que, al hacer clic, abre Cygwin y ejecuta el script de shell.
Me gustaría ampliar la respuesta dada por Austin Hastings para permitir que funcione sin Cygwin en la ruta y para trabajar en la configuración del directorio con el archivo bat (por lo que incluso se usa un acceso directo con una ruta diferente de "Comenzar en") . Los cambios son para incluir la ruta completa de bash, use la opción -l
para hacer la configuración de bash correctamente con las rutas y el entorno y para pasar el directorio actual a bash como el primer argumento que aparece (usando shift
). Recuerde usar las nuevas líneas de Unix en el archivo o obtendrá muchos errores. También use UTF8 en lugar de ANSI.
: <<TRAMPOLINE
@echo off
C:/cygwin/bin/bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1)
setlocal EnableDelayedExpansion
for %%i in (%*) do set _args= !_args! "%%~i"
C:/cygwin/bin/bash -l "%~f0" "%CD%" %_args%
goto :EOF
TRAMPOLINE
#####################
#!/bin/bash -- it''s traditional!
cd "$1"
shift
echo Working from $PWD
Editar: Se corrigió el código del trampolín para pasar los argumentos correctamente a bash. Los archivos BAT no tienen un equivalente bash de "$ @" y se procesa un bucle en cada argumento y luego se pasa a bash.exe. Ahora maneja correctamente los argumentos con espacios.
Para ejecutar "foo.bsh", cree un archivo por lotes con el siguiente contenido y ejecútelo:
set PATH=C:/cygwin/bin;%PATH%
c:/cygwin/bin/bash.exe c:/path/to/foo.bsh
La parte "C: / cygwin / bin" puede diferir según la ubicación de instalación elegida de cygwin.
Para ejecutar "your_bash_file" desde cualquier archivo .bat, escriba la siguiente línea en .bat:
git-bash.exe (path_to_your_bash_file>)
PS Windows Git es necesario instalado
Puedes probar algo como esto para el trampolín de CMD a BASH (o cualquier variante de sh):
: <<TRAMPOLINE
@echo off
bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1)
bash "%~f0" "%*"
goto :EOF
TRAMPOLINE
#####################
#!/bin/bash -- it''s traditional!
echo "Hello from $SHELL"
Si también desea abrir el script en una ventana de lujo, esto (basado en la respuesta de @galmok) hará el truco.
: <<TRAMPOLINE
@echo off
C:/Users/user/Downloads/cyg-packages/bin/bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1)
setlocal EnableDelayedExpansion
for %%i in (%*) do set _args= !_args! "%%~i"
C:/Users/user/Downloads/cyg-packages/bin/mintty.exe -i /Cygwin-Terminal.ico C:/Users/user/Downloads/cyg-packages/bin/bash -l "%~f0" "%CD%" %_args%
goto :EOF
TRAMPOLINE
#####################
#!/bin/bash -- it''s traditional!
cd "$1"
shift
echo Working from $PWD
vim "$@"
Nota: mi caso de uso fue la necesidad de abrir un terminal vim desde Visual Studio, por lo que hay una llamada a vim
al final. El archivo por lotes saldrá después.