Hier ist mein Anwendungsfall: Das Befehlszeilenprogramm melt
kann einen Dateinamen mit der Erweiterung .melt
in der Befehlszeile akzeptieren und öffnen. Als Beispiel ist dies eine richtige test_p.melt
Datei:
colour:blue
out=24
colour:red
out=48
... die öffnet und spielt mit melt test_p.melt
.
Die Sache ist nun, dass .melt
Dateien keine Kommentare unterstützen, was ich mir wünschte (Sie erhalten Fehlermeldungen für jede Zeile, die ein nicht analysierbares Argument enthält, einschließlich solcher mit beispielsweise a #
). Also hier ist eine kommentierte test_c.melt
Datei:
# master comment here
colour:blue # this is blue!
out=24
colour:red
out=48
Wenn Sie dies melt
direkt öffnen, erhalten Sie:
$ melt test_c.melt
Failed to load "# master comment here"
...
... und es wird kein blauer Bildschirm angezeigt.
Also dachte ich mir - nun, ich kann trotzdem Kommentare einfügen und dann die Bash-Prozessersetzung verwenden, um die Datei zu filtern sed
, und diese einfach der melt
Anwendung zur Verfügung stellen. Zuerst habe ich einen Test mit versucht cat
, der erfolgreich ist:
$ cat <(sed 's/#.*$//' test_c.melt)
colour:blue
out=24
colour:red
out=48
... sieht gut aus; aber wenn ich das mit versuche, melt
sieht es durch meinen Trick:
$ melt <(sed 's/#.*$//' test_c.melt)
Failed to load "/dev/fd/62"
Failed to load "/dev/fd/62"
Grundsätzlich hat Melt den Dateinamen des Rohrs Bash erhalten, das für die Prozessersetzung bereitgestellt wurde - aber leider melt
wird es argv[i]
direkt verarbeitet . und im Falle einer Datei muss eine .melt
Erweiterung im Dateinamen angezeigt werden; Wenn dies nicht der Fall ist, schlägt der Prozess fehl.
Meine Frage lautet also: Wie könnte ich die Prozessersetzung verwenden - also hat der Dateiname der Pipe in diesem Fall eine bestimmte Erweiterung .melt
? Grundsätzlich möchte ich als Ergebnis der Substitution einen Pipe-Dateinamen von /dev/fd/62.melt
, von dem ich denke, dass er übergeben wird.
NB: Natürlich kann ich immer tun:
sed 's/#.*$//' test_c.melt > test_c_temp.melt
melt test_c_temp.melt
... aber zuerst gibt es hier zwei Befehle - und ich möchte eine einzeilige Pipeline; und zum anderen eröffnet es ein weiteres Problem, wenn ich darüber nachdenke, temporäre Dateien danach zu entfernen, was mir nicht gefällt.
Ist dies mit Bash-Prozessersetzung möglich - oder irgendwie mit Standard-Linux-Tools?
melt
kümmert es mich nicht um Befehle, die durchgeleitet werden stdin
, da ich: Usage: melt [options] [producer [name=value]* ]+
und einen Speicherauszug von Programmoptionen bekomme . Prost!
man melt
für dich lesen . " Wenn keine Dateien angegeben sind, wird die Komprimierung auf die Standardeingabe angewendet ." So sed 's/#.*$//' test_c.melt | melt > result.file
arbeiten können.
melt
(MLT Melt 0.6.2; "Standardeingabe" wird in dieser Version nicht erwähnt man melt
), da ich für diesen Befehl wieder Usage: melt [options] [producer [name=value]* ]+
und bekomme eine Müllkippe. Prost!
man melt
auf Ihrer Maschine lesen . Wenn Sie keine Antwort finden können, posten Sie auf pastebin.com und posten Sie den Link hier.
melt < <(sed 's/#.*$//' test_c.melt)