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' echo
utilitaire génère une nouvelle ligne, avec une valeur hexadécimale 0A
et aucune autre sortie. Car <<<a
c'est 61 0A
.
L' od
utilitaire, 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 00
convertie 005000
en big-endian ou 000012
en little-endian. 61 0A
devient 005141
en little-endian et 060412
en 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
, 1
ou 2
pour 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|od
en 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 a
peut être utilisé pour les versions portables. Tous les scripts fonctionnent en bash, ksh et zsh, tandis que les scripts portables fonctionnent en tiret.