Hay varias formas de ejecutar diferentes comandos en bash
y cmd
con el mismo script.
cmd
ignorará las líneas que comienzan con :;
, como se menciona en otras respuestas. También ignorará la siguiente línea si la línea actual termina con el comando rem ^
, ya que el ^
personaje escapará del salto de línea y la siguiente línea será tratada como un comentario por rem
.
En cuanto a hacer bash
ignorar las cmd
líneas, hay varias formas. He enumerado algunas formas de hacerlo sin romper los cmd
comandos:
#
Comando inexistente (no recomendado)
Si no hay ningún #
comando disponible cmd
cuando se ejecuta el script, podemos hacer esto:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
El #
carácter al principio de la cmd
línea hace bash
que trate esa línea como un comentario.
El #
carácter al final de la bash
línea se usa para comentar el \r
personaje, como señaló Brian Tompsett en su respuesta . Sin esto, bash
arrojará un error si el archivo tiene \r\n
finales de línea, requeridos por cmd
.
Haciendo # 2>nul
, estamos engañando cmd
para ignorar el error de algún #
comando inexistente , mientras seguimos ejecutando el comando que sigue.
No use esta solución si hay un #
comando disponible en el PATH
o si no tiene control sobre los comandos disponibles paracmd
.
Usando echo
para ignorar el #
personaje encmd
Podemos usar echo
con su salida redirigida para insertar cmd
comandos enbash
el área comentada:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Dado que el #
carácter no tiene un significado especial en cmd
, se trata como parte del texto para echo
. Todo lo que teníamos que hacer era redirigir la salida delecho
comando e insertar otros comandos después.
#.bat
Archivo vacío
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
La echo >/dev/null # 1>nul 2> #.bat
línea crea un #.bat
archivo vacío mientras está encendido cmd
(o reemplaza el existente#.bat
, si lo hay) y no hace nada mientras está encendido bash
.
Este archivo será utilizado por la cmd
(s) línea (s) que sigue incluso si hay alguna otra#
comando en el PATH
.
El del #.bat
comando en el cmd
código específico elimina el archivo que se creó. Solo tienes que hacer esto en la última cmd
línea.
No use esta solución si un #.bat
archivo podría estar en su directorio de trabajo actual, ya que ese archivo se borrará.
Recomendado: usar here-document para ignorar cmd
comandos enbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Al colocar el ^
carácter al final de la cmd
línea, nos escapamos del salto de línea, y al usar :
como delimitador del documento aquí, el contenido de la línea delimitador no tendrá ningún efecto sobre cmd
. De esa manera, cmd
solo ejecutará su línea después de:
línea haya terminado, teniendo el mismo comportamiento que bash
.
Si desea tener varias líneas en ambas plataformas y solo ejecutarlas al final del bloque, puede hacer esto:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Siempre que no haya una cmd
línea con exactamente here-document delimiter
, esta solución debería funcionar. Puede cambiar here-document delimiter
a cualquier otro texto.
En todas las soluciones presentadas, los comandos solo se ejecutarán después de la última línea , lo que hace que su comportamiento sea consistente si hacen lo mismo en ambas plataformas.
Esas soluciones deben guardarse en archivos con \r\n
saltos de línea, de lo contrario no funcionarán cmd
.