Either the write_once() should execute once_file["mode"] = "a" so further lines are appended instead of replacing the file, or the code should be refactored to work like the tee() command and keep a reference to the opened file for re-use until unset_once_if_written() is called (which would then close the file). With that second option, you could then also drop the written_to_once_file flag variable, because the opened file object would only exist if there had been output to write.
When using
.once -o ...
, only the last line of the next output remains in the file once that command has completed.That's because the
write_once()
function is executed for each individual output line, and each time the output file is opened with a newopen(**once_file)
call. Because the-o
sets the file mode to"w"
, the output file is truncated for each line, and so all preceding output is lost.Either the
write_once()
should executeonce_file["mode"] = "a"
so further lines are appended instead of replacing the file, or the code should be refactored to work like thetee()
command and keep a reference to the opened file for re-use untilunset_once_if_written()
is called (which would then close the file). With that second option, you could then also drop thewritten_to_once_file
flag variable, because the opened file object would only exist if there had been output to write.