Heiko Schlittermann hs@schlittermann.de (Do 12 Jul 2018 14:50:20 CEST):
Jochen Topf jochen@remote.org (Do 12 Jul 2018 09:09:49 CEST):
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.
#!/bin/bash read || exit test $# = 1 && exec 1>"$1" printf '%s\n' "$REPLY" exec cat
Hier noch einer mit Perl:
perl -e 'sysread(STDIN, $_, 1) or exit 0; open(STDOUT, ">", shift); print; exec "cat"'
Oder als Script etwas leserlicher:
#!/usr/bin/perl sysread(STDIN, $_, 1) or exit 0; open(STDOUT, '>', shift // die "$0: Need a file name"); print; exec 'cat';
Oder Pure Perl, aber das hatte Thomas schon, mit Fehlerbehandlung left as an excercise to the reader ;)
#!/usr/bin/perl die "Usage: $0 FILE\n" unless @ARGV == 1; $/ = \4096; # use 4k chunks, not line by line defined($_ = <STDIN>) and open(STDOUT, '>', shift) and print and print while <STDIN>;
-- Heiko