Reto : escriba un único archivo de script foo.cmd
que se pueda invocar desde el cmd.exe
indicador de Windows (no PowerShell, no en modo administrador), para ejecutar código arbitrario específico de Windows ...
> .\foo.cmd
Hello Windows!
... pero también ser invocada inalterada desde una típica compatible con POSIX (Linux / OSX) Indicador Shell ( bash
, tcsh
o zsh
), para ejecutar código arbitrario POSIX-específica:
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
... sin necesidad de instalar o crear intérpretes / herramientas de terceros.
Sé que esto es posible, pero con cruft (es decir, en Windows, una o dos líneas de basura / mensaje de error se imprimen en stderr o stdout antes de "¡Hola Windows!").
El criterio ganador es la minimización de (primero) el número de líneas cruft y (segundo) el número de caracteres cruft.
Cruft se puede definir como cualquier salida de consola (stdout o stderr) que no se produce mediante el código de carga útil (arbitrario). Las líneas en blanco se cuentan en el recuento de líneas. Las líneas nuevas no se cuentan en el recuento de caracteres. Los puntajes crudos deben sumarse en ambas plataformas. Hagamos caso omiso de mecanismos como cls
ese barren la ruina pero a costa de eliminar también la salida de terminal anterior. Si Windows repite sus comandos porque aún no lo @echo off
ha activado , excluyamos los caracteres que gasta al imprimir el directorio actual y la solicitud.
Un criterio secundario es la simplicidad / elegancia de la solución interna foo.cmd
: si la "infraestructura" se define como cualquier carácter que no esté directamente involucrado en el código arbitrario de la carga útil, minimice primero el número de líneas que contienen caracteres de infraestructura, y segundo el número total de infraestructura caracteres.
¡Felicitaciones adicionales si la parte POSIX funcionará a pesar de que el archivo tenga finales de línea CRLF! (No estoy seguro de que la última parte sea posible).
Mi solución existente, que publicaré aquí una vez que otros hayan tenido la oportunidad, usa 6 líneas de código de infraestructura (52 caracteres excluyendo nuevas líneas). Produce 5 líneas de cruft, dos de las cuales están en blanco, todas las cuales ocurren en Windows (30 caracteres excluyendo nuevas líneas y excluyendo la cadena actual de directorio / solicitud que aparece en dos de esas líneas).