Задача : написать один файл сценария, foo.cmd
который можно вызвать из командной cmd.exe
строки Windows (не PowerShell, не в режиме администратора), чтобы выполнить произвольный специфичный для Windows код ...
> .\foo.cmd
Hello Windows!
... но также может быть вызвана неизменным из типичного POSIX-совместимой (Linux / OSX) приглашение оболочки ( bash
, tcsh
или zsh
), чтобы выполнить произвольный POSIX-специфический код:
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
... без необходимости установки или создания сторонних переводчиков / инструментов.
Я знаю, что это возможно, но с помощью cruft (то есть в Windows одна или две строки мусора / сообщения об ошибке выводятся в stderr или stdout перед «Hello Windows!»).
Критерием выигрыша является минимизация (первого) количества линий крафта и (второго) количества символов крафта.
Cruft может быть определен как любой вывод консоли (stdout или stderr), который не создается (произвольным) кодом полезной нагрузки. Пустые строки учитываются в количестве строк. Новые строки не учитываются при подсчете символов. Баллы по фрифту должны суммироваться на обеих платформах. Давайте не cls
будем обращать внимания на такие механизмы, которые сметают сумасшествие, но за счет того, что также удаляются предыдущие результаты терминала. Если Windows повторяет ваши команды, потому что вы еще не включили @echo off
, давайте исключим символы, которые она тратит на печать текущего каталога и приглашения.
Вторичным критерием является простота / элегантность решения внутри foo.cmd
: если «инфраструктура» определяется как любой символ, непосредственно не участвующий в произвольном коде полезной нагрузки, то сначала минимизируйте количество строк, содержащих символы инфраструктуры, а затем - общее количество инфраструктуры. персонажи.
Дополнительные похвалы, если POSIX-часть будет работать, несмотря на то, что в файле есть окончания CRLF! (Не уверен, что последняя часть даже возможна.)
Мое существующее решение, которое я опубликую здесь, как только у других появится возможность, использует 6 строк кода инфраструктуры (52 символа без учета новых строк). Он выдает 5 строк Cruft, две из которых являются пустыми, и все они происходят в Windows (30 символов, исключая символы новой строки и исключая текущую строку каталога / приглашения, которая появляется в двух из этих строк).