Défi : écrire un seul fichier de script foo.cmd
qui peut être invoqué à partir de l' cmd.exe
invite Windows vanille (pas PowerShell, pas en mode administrateur), pour exécuter du code arbitraire spécifique à Windows ...
> .\foo.cmd
Hello Windows!
... mais aussi être invoquée sans modification à partir d'une invite de shell typique conforme à POSIX (Linux / OSX) (bash
, tcsh
ou zsh
), pour exécuter arbitraire code spécifique POSIX:
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
... sans nécessiter l'installation ou la création d'interprètes / outils tiers.
Je sais que c'est possible, mais avec cruft (c'est-à-dire sous Windows, une ou deux lignes de déchets / message d'erreur sont imprimées sur stderr ou stdout avant "Bonjour Windows!").
Le critère gagnant est la minimisation du (premier) nombre de lignes de découpe et (deuxièmement) du nombre de caractères de gravure.
Cruft peut être défini comme n'importe quelle sortie de console (stdout ou stderr) qui n'est pas produite par le code de charge utile (arbitraire). Les lignes vides sont comptées dans le nombre de lignes. Les sauts de ligne ne sont pas comptés dans le nombre de caractères. Les scores de Cruft doivent être additionnés sur les deux plates-formes. cls
Méconnaissons des mécanismes comme celui-ci qui balaient la cruauté mais au prix de masquer également la sortie du terminal précédent. Si Windows fait écho à vos commandes parce que vous ne l'avez pas @echo off
encore fait, excluons les caractères qu'il dépense lors de l'impression du répertoire et de l'invite actuels.
Un critère secondaire est la simplicité / élégance de la solution à l'intérieur foo.cmd
: si "infrastructure" est définie comme n'importe quel caractère non directement impliqué dans le code de charge utile arbitraire, minimisez d'abord le nombre de lignes qui contiennent des caractères d'infrastructure, puis le nombre total d'infrastructure personnages.
Félicitations supplémentaires si la partie POSIX fonctionne malgré le fichier ayant des fins de ligne CRLF! (Je ne suis pas sûr que la dernière partie soit même possible.)
Ma solution existante, que je posterai ici une fois que d'autres auront eu la chance, utilise 6 lignes de code d'infrastructure (52 caractères hors newlines). Il produit 5 lignes de découpe, dont deux sont vides, qui se produisent toutes sur Windows (30 caractères excluant les sauts de ligne et excluant le répertoire / la chaîne d'invite actuelle qui apparaît sur deux de ces lignes).