On Thu, Jul 12, 2018 at 09:09:49AM +0200, Jochen Topf <joc...@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

-- 
 Thomas Köhler       Email:       jean-...@picard.franken.de
     <><             WWW:              http://gott-gehabt.de
                     IRC: tkoehler       Freenode: thkoehler
                     PGP public key available from Homepage!

Attachment: signature.asc
Description: Digital signature

Antwort per Email an