On Thu, Jul 12, 2018 at 09:09:49AM +0200, Jochen Topf jochen@remote.org wrote:
On Wed, Jul 11, 2018 at 09:01:18AM +0200, Rene Terlecki wrote:
ich habe hier eine kleine Kopfnuss mein Ziel ist, den Output eines Befehls in eine Datei zu schreiben, aber nur wenn er nicht leer ist
Lösungen mit temporären Dateien und Variablen habe ich bereits gefunden allerdings bin ich mir sicher, dass es noch einfachere Ansätze mit Pipen und logischen Operatoren gibt
Ich glaube nicht, dass das rein in der Shell funktionieren kann. Das Problem ist, dass die Shell die Datei aufmacht, in die umgeleitet wird und dann den offenen Dateidescriptor an das Programm übergibt, dass den Output erzeugt. Das Programm schreibt dann einfach da rein. Beim Öffnen der Datei wird diese aber schon angelegt.
Die Lösung ist relativ einfach mit einem externen Programm zu erledigen, das quasi wie "cat" funktioniert, also Daten einfach durchleitet, aber die Ausgabedatei selbst aufmacht und zwar erst dann, wenn zum ersten Mal Daten ankommen. Ich weiß von keinem Programm, dass das macht, aber es ist auch nicht schwierig, sowas zu schreiben.
Hier hast du eins:
~> cat t.pl #!/usr/bin/perl # #
use strict; use warnings;
my $file = $ARGV[0]; my $HANDLE = undef;
while(<STDIN>) { unless(defined($HANDLE)) { if($file) { open($HANDLE,">>",$file) or $HANDLE = *STDOUT; } else { $HANDLE = *STDOUT; } } print $HANDLE $_; } ~> echo -n "" | perl t.pl /tmp/foo ~> cat /tmp/foo cat: /tmp/foo: No such file or directory ~> echo "foo" | perl t.pl /tmp/foo ~> cat /tmp/foo foo ~>
Ciao, Thomas