Sfida : scrivere un singolo file di script foo.cmd
che può essere richiamato dal cmd.exe
prompt di Windows vanilla (non PowerShell, non in modalità amministratore), per eseguire codice arbitrario specifico per Windows ...
> .\foo.cmd
Hello Windows!
... ma anche essere richiamato inalterato da una tipica POSIX (Linux / OSX) Shell Prompt ( bash
, tcsh
o zsh
), per eseguire codice arbitrario POSIX-specifico:
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
... senza richiedere l'installazione o la creazione di interpreti / strumenti di terze parti.
So che è possibile, ma con cruft (cioè su Windows, una o due righe di immondizia / messaggio di errore vengono stampate su stderr o stdout prima di "Ciao Windows!").
Il criterio vincente è la minimizzazione del (primo) numero di linee di cruft e (secondo) del numero di caratteri di cruft.
Cruft può essere definito come qualsiasi output di console (stdout o stderr) che non è prodotto dal codice di payload (arbitrario). Le righe vuote vengono conteggiate nel conteggio delle righe. Le nuove righe non vengono conteggiate nel conteggio dei personaggi. I punteggi di Cruft devono essere sommati su entrambe le piattaforme. Ignoriamo meccanismi del genere cls
che spazzano via l'innesto ma a costo di oscurare anche l'output del terminale precedente. Se Windows echi i tuoi comandi perché non hai ancora girato @echo off
, escludiamo i caratteri che spende nella stampa della directory corrente e del prompt.
Un criterio secondario è la semplicità / eleganza della soluzione interna foo.cmd
: se "infrastruttura" è definita come qualsiasi carattere non direttamente coinvolto nel codice di payload arbitrario, quindi minimizzare prima il numero di righe che contengono caratteri di infrastruttura e in secondo luogo il numero totale di infrastrutture personaggi.
Complimenti extra se la parte POSIX funzionerà nonostante il file abbia terminazioni di riga CRLF! (Non sono sicuro che l'ultima parte sia persino possibile.)
La mia soluzione esistente, che posterò qui una volta che gli altri avranno avuto una possibilità, utilizza 6 righe di codice di infrastruttura (52 caratteri esclusi i newline). Produce 5 righe di cruft, due delle quali sono vuote, tutte presenti su Windows (30 caratteri escludendo le nuove righe ed escludendo l'attuale stringa directory / prompt che appare su due di quelle righe).