Тема: CMD/BAT + BASH: Два в одном
В дополнение к теме Коллекция скриптов и идей → CMD/BAT → CMD/BAT + JS/VBS/PS1/WSF/HTA/PL/PY: Два в одном и последующему обсуждению Общение → CMD/BAT → CMD/BAT + JS/VBS/PS1/WSF/HTA/PL: Два в одном
Нашел еще один гибрид bash+cmd. Два варианта
Вариант 1
Хитрость в том, что пролог состоит из строк кода, корректных как для bash так и для cmd. Вся хитрость в символе SUB (ascii26).
двоеточий (:) пробел (ascii32) решетка (#) пробел (ascii32) SUB (ascii26) набор команд cmd
-- cmd интерпретирует его как разделитель строк, таким образом каждая строка (от начала строки и до CRLF) разбивается на две и рассматривается как две отдельные строки кода. Таким образом, первая часть строки до SUB - метка, вторая - обычная команда.
-- Далее вызывается bash, которому передается этот же файл на исполнение и передаются все входные параметры. Для bash все эти строки - набор пустых команды (двоеточие) с последующим комментарием (решетка и до конца строки).
В браузере символ не видим, но, вроде бы, копируется в буфер. Способ не самый удобный (из-за некоторой трудности ввода символа SUB), но универсальный.
: # @echo off
: # echo:==== cmd
: # bash "%~f0" %*
: # echo:==== cmd again
: # goto :EOF
echo "==== bash"
for n in "$@" ; do echo "$n" ; done
exit
Вариант 2
-- Первая строка для cmd - метка и текст, который игнорируется при исполнении. Далее вызывается bash.
-- Bash видит пустую команду (двоеточие) и heredoc (текст меджу метками ____CMD____).
Этот вариант проще создать (не надо выдумывать способ ввода символа SUB). Благодаря тому, что маркер heredoc обрамлен апострофами, текст внутри не интерпретируется.
: << '____CMD____'
@echo off
echo:==== cmd
bash "%~f0" %*
echo:==== cmd again
goto :eof
____CMD____
echo "==== bash"
for n in "$@" ; do echo "$n" ; done
exit 0