Existem várias maneiras de executar comandos diferentes sobre bash
e cmd
com o mesmo script.
cmd
irá ignorar as linhas que começam com :;
, conforme mencionado em outras respostas. Ele também irá ignorar a próxima linha se a linha atual terminar com o comando rem ^
, pois o ^
caractere escapará da quebra de linha e a próxima linha será tratada como um comentário de rem
.
Quanto a fazer bash
ignorar as cmd
linhas, existem várias maneiras. Eu enumerei algumas maneiras de fazer isso sem quebrar os cmd
comandos:
#
Comando inexistente (não recomendado)
Se não houver nenhum #
comando disponível cmd
quando o script for executado, podemos fazer o seguinte:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
O #
caractere no início da cmd
linha faz com bash
que trate essa linha como um comentário.
O #
personagem no final da bash
linha é usado para comentar o \r
personagem, como Brian Tompsett apontou em sua resposta . Sem isso, bash
será gerado um erro se o arquivo tiver \r\n
terminações de linha, exigidas por cmd
.
Ao fazer # 2>nul
isso, estamos enganando cmd
para ignorar o erro de algum #
comando inexistente , enquanto ainda executamos o comando a seguir.
Não use esta solução se houver um #
comando disponível no PATH
ou se você não tiver controle sobre os comandos disponíveis para cmd
.
Usando echo
para ignorar o #
personagem emcmd
Podemos usar echo
com sua saída redirecionada para inserir cmd
comandos na bash
área comentada de:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Como o #
caractere não tem nenhum significado especial cmd
, ele é tratado como parte do texto para echo
. Tudo o que precisamos fazer é redirecionar a saída do echo
comando e inserir outros comandos depois dele.
#.bat
Arquivo vazio
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
A echo >/dev/null # 1>nul 2> #.bat
linha cria um #.bat
arquivo vazio enquanto ligado cmd
(ou substitui o existente #.bat
, se houver) e não faz nada enquanto está ligado bash
.
Este arquivo será usado pela cmd
(s) linha (s) que segue, mesmo se houver algum outro #
comando no PATH
.
O del #.bat
comando no cmd
código específico exclui o arquivo que foi criado. Você só precisa fazer isso na última cmd
linha.
Não use esta solução se um #.bat
arquivo puder estar em seu diretório de trabalho atual, pois esse arquivo será apagado.
Recomendado: usar here-document para ignorar cmd
comandos embash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Ao colocar o ^
caractere no final da cmd
linha, estamos escapando da quebra de linha e usando :
como delimitador here-document, o conteúdo da linha delimitadora não terá efeito cmd
. Dessa forma, cmd
só executará sua linha após o término da :
linha, tendo o mesmo comportamento que bash
.
Se quiser ter várias linhas em ambas as plataformas e executá-las apenas no final do bloco, você pode fazer o seguinte:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Desde que não haja uma cmd
linha exata here-document delimiter
, essa solução deve funcionar. Você pode mudar here-document delimiter
para qualquer outro texto.
Em todas as soluções apresentadas, os comandos só serão executados após a última linha , tornando seu comportamento consistente se fizerem a mesma coisa nas duas plataformas.
Essas soluções devem ser salvas em arquivos com \r\n
quebras de linha, caso contrário, não funcionarão cmd
.