Diese Seite hatte viele Probleme mit der Implementierung verschiedener Sprachen in Interpreter- Tags. Praktisch alle waren esoterische Sprachen, die niemand benutzte. Es ist Zeit, einen Dolmetscher für eine praktische Sprache zu entwickeln, die die meisten Benutzer hier wahrscheinlich bereits kennen. Ja, es ist ein Shell-Skript, falls Sie Probleme haben, den Titel zu lesen (nicht das, was Sie haben). (Ja, ich habe diese Herausforderung absichtlich gemeistert, da es mir langweilig ist, dass Sprachen wie GolfScript und Befunge alles gewinnen. Deshalb habe ich einige Herausforderungen gestellt, bei denen eine praktischere Programmiersprache größere Gewinnchancen hat.)
Da das Shell-Skript jedoch eine relativ große Sprache ist, werde ich Sie nicht bitten, es zu implementieren. Stattdessen werde ich einen kleinen Teil der Shell-Skriptfunktionalität erstellen.
Die Untergruppe, für die ich mich entschieden habe, ist die folgende Untergruppe:
- Ausführen von Programmen (Programme enthalten jedoch nur Buchstaben, auch wenn einfache Anführungszeichen zulässig sind)
- Programmargumente
- Einfache Anführungszeichen (akzeptieren alle druckbaren ASCII-Zeichen, einschließlich Leerzeichen, ohne einfache Anführungszeichen)
- Zeichenfolgen ohne Anführungszeichen (ASCII-Buchstaben, -Zahlen und -Bindestriche sind zulässig)
- Rohre
- Leere Anweisungen
- Mehrere Anweisungen durch eine neue Zeile getrennt
- Nachgestellte / führende / mehrere Leerzeichen
In dieser Task müssen Sie die Eingabe von STDIN lesen und jeden angeforderten Befehl ausführen. Sie können mit Sicherheit von einem POSIX-kompatiblen Betriebssystem ausgehen, sodass keine Portabilität mit Windows oder Ähnlichem erforderlich ist. Sie können davon ausgehen, dass die Programme, die nicht an andere Programme weitergeleitet werden, nicht aus STDIN lesen. Sie können davon ausgehen, dass die Befehle vorhanden sein werden. Sie können davon ausgehen, dass nichts anderes verwendet wird. Wenn eine sichere Annahme gebrochen ist, können Sie alles tun. Sie können sicher annehmen, dass höchstens 15 Argumente und Zeilen mit weniger als 512 Zeichen vorhanden sind (wenn Sie eine explizite Speicherzuweisung benötigen oder so etwas - ich werde wirklich kleine Gewinnchancen für C geben, auch wenn diese noch klein sind). Sie müssen keine Dateideskriptoren bereinigen.
Sie können Programme jederzeit ausführen - auch nach Erhalt der vollständigen Zeile oder nach Beendigung von STDIN. Wählen Sie einen beliebigen Ansatz.
Einfacher Testfall, mit dem Sie Ihre Shell testen können (beachten Sie das Leerzeichen nach dem dritten Befehl):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
Das obige Programm sollte folgendes Ergebnis ausgeben:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Sie dürfen die Shell nicht selbst ausführen, es sei denn, Sie haben keine Argumente für den Befehl (diese Ausnahme wurde für Perl gemacht, das den Befehl in der Shell ausführt, wenn nur ein Argument eingegeben wird system, aber Sie können diese Ausnahme für andere missbrauchen auch Sprachen, wenn Sie dies auf eine Weise tun können, die Zeichen spart), oder der Befehl, den Sie ausführen, ist die Shell selbst. Dies ist wahrscheinlich das größte Problem bei dieser Herausforderung, da viele Sprachen systemFunktionen haben, die Shell ausführen. Verwenden Sie stattdessen Sprach-APIs, die Programme direkt aufrufen, z. B. subprocessModule in Python. Dies ist ohnehin eine gute Idee für die Sicherheit, und Sie möchten keine unsichere Shell erstellen, oder? Dies stoppt höchstwahrscheinlich PHP, aber es gibt trotzdem andere Sprachen zur Auswahl.
Wenn Sie vorhaben , Ihr Programm in Shell - Skript zu machen, sind Sie nicht verwenden dürfen eval, sourceoder .(wie in, eine Funktion, kein Zeichen). Das würde meiner Meinung nach die Herausforderung zu einfach machen.
Cleverer Regelmissbrauch erlaubt. Es gibt viele Dinge, die ich ausdrücklich untersagt habe, aber ich bin mir fast sicher, dass Sie immer noch Dinge tun dürfen, an die ich nicht gedacht habe. Manchmal wundert es mich, wie Leute meine Regeln interpretieren. Denken Sie auch daran, dass Sie alles für alles tun können, was ich nicht erwähnt habe. Wenn ich zum Beispiel versuche, Variablen zu verwenden, können Sie die Festplatte löschen (aber bitte nicht).
Der kürzeste Code gewinnt, da dies Codegolf ist.