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 echoDienstprogramm gibt eine Newline mit Hex-Wert 0Aund keine andere Ausgabe aus. Für <<<aes ist 61 0A.
Das odDienstprogramm 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 005000Big-Endian oder einen 000012Little-Endian konvertiert wird . 61 0Awird 005141in Little-Endian und 060412in Big-Endian. Die vollständige Ausgabe von od enthält auch Adress- und Größendaten, die wir nicht verwenden 0können 1, oder 2fü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|odAnfü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 akann für die tragbaren Versionen verwendet werden. Alle Skripte funktionieren in bash, ksh und zsh, und die portablen Skripte funktionieren in dash.