Bash (y otros shells de Unix), 32 (33) bytes
Primer y segundo intento:
case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L # non-portable
Gracias a Dennis, versión más corta:
od<<<a|grep -q 5&&echo L||echo B # non-portable
echo|od|grep -q 5&&echo B||echo L # portable
La echoutilidad genera una nueva línea, con valor hexadecimal 0A, y ninguna otra salida. Pues <<<alo es 61 0A.
La odutilidad, por defecto, interpreta la entrada como palabras de dos bytes, rellena con ceros si el número de bytes es impar, y convierte a octal. Esto hace que la salida del eco se interprete como 0A 00, que se convierte en 005000big-endian o 000012en little-endian. 61 0Ase convierte 005141en little-endian y 060412en big-endian. La salida completa de OD también incluye la dirección y tamaño de los datos que significa que no podemos utilizar 0, 1o 2para la prueba.
El comando está bien definido para exponer la resistencia del sistema. De la norma :
El orden de bytes utilizado al interpretar los valores numéricos está definido por la implementación, pero debe corresponder al orden en el que se almacena una constante del tipo correspondiente en la memoria del sistema.
Notas de compatibilidad
No estoy seguro si poner echo|odcomillas traseras sin comillas dobles alrededor de ellas [lo que da como resultado un argumento de tres palabras para case] es compatible con todos los sistemas. No estoy seguro de si todos los sistemas admiten scripts de shell sin nueva línea de terminación. Estoy casi seguro, pero no el 100% del comportamiento de od al agregar el byte de relleno en los sistemas big-endian. Si es necesario, echo ase puede usar para las versiones portátiles. Todos los scripts funcionan en bash, ksh y zsh, y los portátiles funcionan en el tablero.