Setze in Skript 1 vor der Schleife
Dann klappt es.
Etwas zum Hintergrund:
Dass die Variable
$| das Puffern der Ausgabe steuert, dürfte den meisten klar sein. Unklar ist aber vielleicht, warum obiges Skript1 auf der Kommandozeile auch ohne Änderungen an
$| schön jede Sekunde eine Zeile ausgibt, das aber nicht mehr klappt, wenn es von Skript2 aufgerufen wird!
Die Std-Lib versucht hier besonders schlau zu sein: Wenn eine Ausgabe nicht auf STDERR erfolgt und das Ziel ein Terminal ist, dann wird die Ausgabe zeilenweise gepuffert. Wenn das Ziel aber eine Datei oder Pipe ist, dann wird blockweise gepuffert.
Auch ohne das zweite Skript kann man den Unterschied leicht überprüfen. Man rufe das unveränderte Skript 1 einmal direkt auf:
und dann zum Vergleich durch more gepipet:
Beim zweiten Aufruf erscheinen auch erst alle zehn Zeilen zum Schluss.
Unter C ist es übrigens nicht viel anders als in Perl: Wenn man auch in einer Pipe jede Zeile sofort sehen möchte, sollte man beizeiten ein
fflush() aufrufen. (Oder mit dem Flag O_DIRECT öffnen, was aber langsamer ist, weil dann nach jeder Ein-/Ausgabe geflusht wird.)