1 (изменено: Rumata, 2016-05-17 14:41:42)

Тема: 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
( 2 * b ) || ! ( 2 * b )

2 (изменено: Rumata, 2016-05-17 14:33:15)

Re: CMD/BAT + BASH: Два в одном

Вариант 3
-- Первая строка для cmd - метка и текст, который игнорируется при исполнении. В конце строки стоит циркумфлекс/карет/крышечка (^), символ продолжения строки, который фактически рассматривает следующую строку как продолжение первой. Далее следует вызов bash.
-- Для bash первая строка - пустая команда, вывод в nul и коментарий. Далее следует echo, печатающий также все в null.


: > /dev/null # ^
echo ' > nul
@echo off
echo:==== cmd
bash "%~f0" %*
echo:==== cmd again
goto :eof
' > /dev/null

echo "==== bash"
for n in "$@" ; do echo "$n" ; done
exit
( 2 * b ) || ! ( 2 * b )

3

Re: CMD/BAT + BASH: Два в одном

Поправил вариант 2 (апострофы вокруг начального маркера heredoc) и вариант 3 (апостроф вместо кавычек в строках 2 и 8). С этими изменениями эти способы стали лучше.

Если кому надо, могут использовать вариант 2, как самый прстой и наиболее универсальный.

( 2 * b ) || ! ( 2 * b )