Bash (und andere Unix-Shells), 32 (33) Bytes
Erster und zweiter Versuch:
case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L # non-portable
Dank Dennis, kürzere Version:
od<<<a|grep -q 5&&echo L||echo B # non-portable
echo|od|grep -q 5&&echo B||echo L # portable
Das echo
Dienstprogramm gibt eine Newline mit Hex-Wert 0A
und keine andere Ausgabe aus. Für <<<a
es ist 61 0A
.
Das od
Dienstprogramm interpretiert die Eingabe standardmäßig als Zwei-Byte-Wörter, die bei ungerader Byteanzahl mit Nullen aufgefüllt und in Oktal umgewandelt werden. Dies führt dazu, dass die Ausgabe des Echos als interpretiert wird 0A 00
, das in einen 005000
Big-Endian oder einen 000012
Little-Endian konvertiert wird . 61 0A
wird 005141
in Little-Endian und 060412
in Big-Endian. Die vollständige Ausgabe von od enthält auch Adress- und Größendaten, die wir nicht verwenden 0
können 1
, oder 2
für den Test.
Der Befehl ist genau definiert, um die Endianität des Systems aufzudecken. Aus dem Standard :
Die bei der Interpretation numerischer Werte verwendete Bytereihenfolge ist implementierungsdefiniert, muss jedoch der Reihenfolge entsprechen, in der eine Konstante des entsprechenden Typs im Speicher des Systems gespeichert ist.
Kompatibilitätshinweise
Ich bin mir nicht sicher, ob ich echo|od
Anführungszeichen ohne Anführungszeichen einfügen sollcase
] auf allen Systemen unterstützt wird. Ich bin nicht sicher, ob alle Systeme Shell-Skripte ohne Zeilenumbruch unterstützen. Ich bin mir größtenteils sicher, aber nicht 100% des Verhaltens von od beim Hinzufügen des Füllbytes auf Big-Endian-Systemen. Bei Bedarf echo a
kann für die tragbaren Versionen verwendet werden. Alle Skripte funktionieren in bash, ksh und zsh, und die portablen Skripte funktionieren in dash.