Bash (et autres shells Unix), 32 (33) octets
Première et deuxième tentative:
case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L # non-portable
Merci à Dennis, version plus courte:
od<<<a|grep -q 5&&echo L||echo B # non-portable
echo|od|grep -q 5&&echo B||echo L # portable
L' echoutilitaire génère une nouvelle ligne, avec une valeur hexadécimale 0Aet aucune autre sortie. Car <<<ac'est 61 0A.
L' odutilitaire, par défaut, interprète l'entrée en mots de deux octets, complétée de zéros si le nombre d'octets est impair, et convertit en octal. Il en résulte que la sortie de l'écho est interprétée comme 0A 00convertie 005000en big-endian ou 000012en little-endian. 61 0Adevient 005141en little-endian et 060412en big-endian. La sortie complète de od comprend également l' adresse et des données de taille qui signifie que nous ne pouvons pas utiliser 0, 1ou 2pour le test.
La commande est bien définie pour exposer l'endianité du système. De la norme :
L'ordre d'octet utilisé lors de l'interprétation des valeurs numériques est défini par l'implémentation, mais doit correspondre à l'ordre dans lequel une constante du type correspondant est stockée en mémoire sur le système.
Notes de compatibilité
Je ne suis pas certain que la mise echo|oden place de guillemets arrières sans guillemets [ce qui donne un argument de trois mots case] soit prise en charge sur tous les systèmes. Je ne suis pas certain que tous les systèmes prennent en charge les scripts shell sans fin de ligne. Je suis en grande partie certain, mais pas à 100%, du comportement d’od en ajoutant l’octet de remplissage sur les systèmes big-endian. Si nécessaire, echo apeut être utilisé pour les versions portables. Tous les scripts fonctionnent en bash, ksh et zsh, tandis que les scripts portables fonctionnent en tiret.