Bash (e altre shell unix), 32 (33) byte
Primo e secondo tentativo:
case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L # non-portable
Grazie a Dennis, versione più corta:
od<<<a|grep -q 5&&echo L||echo B # non-portable
echo|od|grep -q 5&&echo B||echo L # portable
L' echoutilità genera una nuova riga, con valore esadecimale 0Ae nessun altro output. Perché <<<alo è 61 0A.
L' odutilità, per impostazione predefinita, interpreta l'input come parole a due byte, a zero se il numero di byte è dispari e converte in ottale. Ciò comporta l'interpretazione dell'output dell'eco 0A 00, che viene convertito in 005000big-endian o 000012in little-endian. 61 0Adiventa 005141in little-endian e 060412in big-endian. L'uscita piena di od comprende anche indirizzi e dimensione dei dati che significa che non possiamo usare 0, 1o 2per il test.
Il comando è ben definito per esporre l'endianità del sistema. Dallo standard :
L'ordine dei byte utilizzato durante l'interpretazione dei valori numerici è definito dall'implementazione, ma deve corrispondere all'ordine in cui una costante del tipo corrispondente è memorizzata nel sistema.
Note sulla compatibilità
Non sono sicuro che inserendo echo|odbackquotes senza virgolette doppie [che si traduce in un argomento di tre parole in case] sia supportato su tutti i sistemi. Non sono sicuro se tutti i sistemi supportano gli script di shell senza una nuova riga finale. Sono per lo più sicuro, ma non del 100%, del comportamento di od con l'aggiunta del byte di riempimento sui sistemi big-endian. Se necessario, echo apuò essere utilizzato per le versioni portatili. Tutti gli script funzionano in bash, ksh e zsh e quelli portatili funzionano in dash.