2016-04-29 14 views
1

ich diese Befehle verwenden einige Dateien in inkscape zu konvertieren:Wie werden virtuelle Dateien übertragen?

python dxf_input.py sample.dxf > output_ink.svg 
python scour.inkscape.py output_ink.svg > output.svg 

Diese Methode funktioniert gut prefectly. Ich möchte jedoch nicht die Datei "output_ink.svg" erstellen müssen. Stattdessen möchte ich diese Datei zum zweiten Befehl leiten.

Ich habe eine Menge Dinge ausprobiert.

Verwendung xargs:

python dxf_input.py sample.dxf | xargs python scour.inkscape.py > output.svg 

scour.inkscape.py: error: no such option: -3

python dxf_input.py sample.dxf | xargs -I{} python scour.inkscape.py {} > output.svg 

xargs: argument line too long

Verwendung FIFO:

python scour.inkscape.py <(>(python dxf_input.py sample.dxf)) 

xml.parsers.expat.ExpatError: no element found: line 1, column 0

mit regulärem Rohr:

python dxf_input.py sample.dxf | python scour.inkscape.py > output.svg 

IOError: [Errno 32] Broken pipe

Nichts hat bisher funktioniert.

+1

Wissen Sie, ob 'scour.inkscape.py' in seiner Datei suchen muss? –

+2

... auch, woher in der Welt hast du die '<(> (...))' -Syntax bekommen? –

+1

Xargs würde nie funktionieren. 'a | xargs b' - nimm die Ausgabe von a und konvertiere sie in Kommandozeilenargumente für das Programm 'b'. z.B. "echo 1 2 3 | xargs grep somefile" wäre das Äquivalent von "grep somefile 1", "grep somefile2", "grep somefile 3" in Folge. –

Antwort

2

Nicht alle Programme Eingabe von jeder Art eines FIFO annehmen kann - sein, dass eine regelmäßige Rohr, eine Named Pipe, ein /dev/fd/NN Descriptor (wie durch <() auf Plattformen geschaffen, wo dies erlaubt ist), usw. - weil FIFOs sind von Natur aus nicht suchbar: Sie können nicht zum Anfang zurückkehren und frühere Inhalte wie bei einer normalen Datei erneut lesen; Sie können nicht direkt zu einem anderen Teil der Datei springen und später wiederkommen. usw.

Somit gibt es keine Lösung, die für alle möglichen Programme innerhalb der Bedingung funktioniert, dass ein "Pipe" benötigt wird.


Erstens, was wird funktionieren, wennscour.inkscape.py aus einem FIFO lesen:

python scour.inkscape.py <(python dxf_input.py sample.dxf) 

Wenn es nicht von einem FIFO lesen kann, sondern erfordert stattdessen eine reguläre Datei, bash nicht habe ein relevantes Primitiv, aber zsh tut:

# This needs zsh, not bash 
python scour.inkscape.py =(python dxf_input.py sample.dxf) 
+0

Ich habe das schon probiert. Er sagt "xml.parsers.expat.ExpatError: kein Element gefunden: Zeile 1, Spalte 0" –

+0

Vermutlich braucht es eine echte Datei, kein FIFO. Müsste in die Quelle graben, um zu sehen, warum, und da Sie nicht auf die Software verlinken ... –

+0

@ ChristophBühler, ...Ich habe geändert, um einen Nur-ZSH-Ansatz zu zeigen, der auch bei dieser Einschränkung funktioniert. –