Есть несколько способов выполнения разных команд в одном bashи cmdтом же скрипте.
cmdбудет игнорировать строки, начинающиеся с :;, как упоминалось в других ответах. Он также проигнорирует следующую строку, если текущая строка заканчивается командой rem ^, так как ^символ выйдет за пределы разрыва строки, а следующая строка будет рассматриваться как комментарий rem.
Что касается bashигнорирования cmdстрок, существует несколько способов. Я перечислил несколько способов сделать это, не нарушая cmdкоманды:
Несуществующая #команда (не рекомендуется)
Если при запуске скрипта нет #доступных команд cmd, мы можем сделать это:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Символ #в начале cmdстроки заставляет bashрассматривать эту строку как комментарий.
Символ #в конце bashстроки используется для комментирования \rперсонажа, как указал Брайан Томпсетт в своем ответе . Без этого bashбудет выдана ошибка, если в файле есть \r\nокончания строк, требуемые cmd.
Поступая так # 2>nul, мы пытаемся cmdигнорировать ошибку какой-то несуществующей #команды, продолжая выполнять следующую команду.
Не используйте это решение, если есть #команда, доступная на сайте, PATHили если у вас нет контроля над командами, доступными для cmd.
Использование echoдля игнорирования #символа наcmd
Мы можем использовать echoего перенаправленный вывод для вставки cmdкоманд в bashзакомментированную область:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Поскольку этот #символ не имеет особого значения cmd, он рассматривается как часть текста echo. Все, что нам нужно было сделать, это перенаправить вывод echoкоманды и вставить после нее другие команды.
Пустой #.batфайл
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
echo >/dev/null # 1>nul 2> #.batСтрока создает пустой #.batфайл при положенной cmd(или заменяет существующие #.bat, если таковые имеются), и ничего не делает при положенной bash.
Этот файл будет использоваться cmdлиниями (ы) , что следует , даже если есть какая -либо другая #команда на PATH.
Команда del #.batв cmdконкретном коде удаляет созданный файл. Вам нужно сделать это только в последней cmdстроке.
Не используйте это решение, если #.batфайл может находиться в вашем текущем рабочем каталоге, так как этот файл будет удален.
Рекомендуется: использовать здесь-документ для игнорирования cmdкоманд наbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Помещая ^символ в конце cmdстроки, мы экранируем разрыв строки, и используя :в качестве разделителя здесь-документа, содержимое строки разделителя не будет иметь никакого эффекта cmd. Таким образом, он cmdбудет выполнять свою строку только после того, как :строка закончится, имея такое же поведение, как bash.
Если вы хотите иметь несколько строк на обеих платформах и выполнять их только в конце блока, вы можете сделать это:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Это решение должно работать, пока нет cmdстроки с точным here-document delimiter. Вы можете изменить here-document delimiterна любой другой текст.
Во всех представленных решениях команды будут выполняться только после последней строки , что делает их поведение согласованным, если они делают одно и то же на обеих платформах.
Эти решения должны быть сохранены в файлах с \r\nразрывами строк, иначе они не будут работать cmd.