Ich muss eine API für Benutzer entwickeln, die mit scala (weder Java) noch mit Shell vertraut sind. Sie schreiben im Grunde genommen Shell-Skripte innerhalb einer Scala-Klasse (ich weiß, dass ich nur externe Shell-Skripte aufrufen kann, aber komm! Auch später werden wir einige Funktionen für allgemeine Shell-Aufgaben haben).
Ich hatte gehofft, etwas wie:
zu erreichen %Vor%Da ich direkter bin, wie kann ich die Zeilen 2-4 (oder eine möglicherweise weniger präzise Version) in Seq [String] umwandeln, die ich in MyMagicTrait bearbeiten könnte?
Ich weiß über sys.process.stringToProcess aber wenn ich:
%Vor%Wie kann ich das Ergebnis jedes Befehls übersichtlich darstellen? Außerdem hatte ich auf eine $ xxx-Notation gehofft.
Beitrag Antworten aktualisieren:
Dank @debilski, @tenshi und @ daniel-c-sobral konnte ich der gewünschten Umsetzung sehr nahe kommen: Ссылка
Scheint, dass die mit Scala 2.10 mitgelieferte String-Interpolation Ihnen hier helfen kann. Zunächst können Sie die einfache Methode $
implementieren, die den Befehl einfach sofort ausführt. Um es zu machen, müssen Sie diese benutzerdefinierte Methode für StringContext
hinzufügen:
Jetzt können Sie es wie folgt verwenden:
%Vor% Sie können seine Syntax nutzen (es ist nur ein Nachteil, dass Sie keinen Platz zwischen $
und "
hinzufügen können) und String-Interpolation innerhalb des Befehls.
Lasst uns jetzt versuchen, euer magisches Merkmal zu implementieren. Es ist im Allgemeinen die gleiche Idee, aber ich verwende auch DelayedInit
, um Befehle richtig zu definieren und dann automatisch während der Klassenerstellung auszuführen.
Und es ist die Verwendung:
%Vor%Beide Lösungen erzeugen die gleiche Ausgabe:
%Vor%Das ist nur ein Skandal auf @ Debilskis und @ Tomasz Ideen, um zu zeigen, dass man sie gut kombinieren kann:
%Vor%Ich sehe nicht wirklich, wie man ein weniger basteln könnte, wenn man Shell mit Scala-Befehlen kombinieren möchte, da man etwas braucht, um anzuzeigen, wo die Shell beginnt und endet.
Diese Ergebnisse sind überall zu finden. Ach, ich denke nicht, dass sys.process für dich ausreichen wird. Lassen Sie uns zuerst dieses Beispiel so schreiben, dass es genau das tut, wonach Sie gefragt haben:
%Vor%Nun, warum es nicht funktioniert:
Zuerst wird cd
eine Ausnahme auslösen - es gibt keine cd
ausführbare Datei. Das ist ein interner Shell-Befehl, also kann nur eine Shell ihn ausführen.
Als Nächstes würde, wenn cd
funktionieren würde, die wget
nicht bei /tmp/test
vorkommen. Jeder der obigen Befehle wird im aktuellen Arbeitsverzeichnis von Java neu ausgeführt. Sie können das Verzeichnis angeben, in dem jeder Befehl ausgeführt werden soll, aber Sie können kein CWD haben (es ist nicht "veränderbar").