2017-07-20 5 views
0

Warum die folgenden:Scala-Prozess anders als Bash?

"find terraform -type f -exec sed -i 's/prevent_destroy *= .*/prevent_destroy = false/g' {} +".! 

schlägt mit:

sed: -e expression #1, char 1: unknown command: `'' 

Während es in einer Schale alles gut funktioniert.

EDIT: Ein weiterer exemple:

"echo 'someText' > someFile").! 
"cat someFile".! // This doesn't print anything 

Warum kann ich nicht in die Datei schreiben?

+0

Könnten Sie mehr Kontext posten? Wie wird die Zeichenkette im Scala-Code gebildet? – Tom

+0

@tom bekommen einen langen scala Ausdruck gepostet. – pedrofurla

Antwort

3

Es ist für mich zu arbeiten, wenn ich die Seq implizite Konvertierung in Process statt String verwenden:

Seq("find", "terraform", "-type", "f", "-exec", "sed", "-i", "s/prevent_destroy *= .*/prevent_destroy = false/g", "{}", "+").! 

Beachten Sie, dass Sie rund um die sed Substitution Befehl die Anführungszeichen nicht brauchen.

Ihr Weg funktioniert nicht, weil Strings konvertiert werden. Werfen Sie einen Blick auf die scala Quellcode (scala.sys.process.Process.scala):

def apply(command: String, cwd: Option[File], extraEnv: (String, String)*): ProcessBuilder = { 
    apply(command.split("""\s+"""), cwd, extraEnv : _*) 

Es ist die Zeichenfolge auf Leer Aufspaltung, die Ihr sed Substitution Befehl bricht. Besser, stattdessen Seq zu verwenden, um dies zu vermeiden.

+0

Das ist ein guter Punkt, aber wenn ich 'Seq (" Echo "," Sometext ","> "," SomeFile ").!' Dann "" cat someFile ".!' Wir können sehen, dass die Datei nicht enthält etwas. – Joan

+1

@Joan '>' ist nicht Teil des Befehls, also sollten Sie entweder (etwas wie) 'Seq (" bash "," -e "," echo sometext> someFile ").!' Oder https: // stackoverflow .com/fragen/9503308/how-to-use-a-redirect-wenn-verwenden-scala-prozess-methoden – dk14

+1

Ja, lesen Sie die Dokumentation für weitere Details: http://www.scala-lang.org/api /2.12.x/scala/sys/process/ProcessBuilder.html 'def #> (f: Datei): ProcessBuilder' Schreibt den Ausgabedatenstrom dieses Prozesses in die angegebene Datei. – Tom