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 echo
utilitário gera uma nova linha, com valor hexadecimal 0A
, e nenhuma outra saída. Pois <<<a
é 61 0A
.
O od
utilitá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 005000
big-endian ou 000012
little-endian. 61 0A
torna 005141
- se em little-endian e 060412
em 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
, 1
ou 2
para 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|od
aspas 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 a
pode 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.