Bash (e outros shells unix), 32 (33) bytes
Primeira e segunda tentativa:
case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L # non-portable
Graças a Dennis, versão mais curta:
od<<<a|grep -q 5&&echo L||echo B # non-portable
echo|od|grep -q 5&&echo B||echo L # portable
O echoutilitário gera uma nova linha, com valor hexadecimal 0A, e nenhuma outra saída. Pois <<<aé 61 0A.
O odutilitário, por padrão, interpreta a entrada como palavras de dois bytes, preenchida com zero se o número de bytes for ímpar e convertida em octal. Isso resulta na saída do eco interpretado como 0A 00, que é convertido em 005000big-endian ou 000012little-endian. 61 0Atorna 005141- se em little-endian e 060412em big-endian. O resultado completo do od também inclui dados de endereço e tamanho o que significa que não pode usar 0, 1ou 2para o teste.
O comando está bem definido para expor a persistência do sistema. Do padrão :
A ordem dos bytes usada na interpretação dos valores numéricos é definida pela implementação, mas deve corresponder à ordem na qual uma constante do tipo correspondente é armazenada na memória do sistema.
Notas de compatibilidade
Não tenho certeza se colocar echo|odaspas sem aspas duplas em volta deles [o que resulta em um argumento de três palavras para case] é suportado em todos os sistemas. Não tenho certeza se todos os sistemas suportam scripts de shell sem nova linha final. Tenho quase certeza, mas não 100%, do comportamento de od ao adicionar o byte de preenchimento em sistemas big-endian. Se necessário, echo apode ser usado para as versões portáteis. Todos os scripts funcionam em bash, ksh e zsh, e os portáteis funcionam em hífen.