http://qs1969.pair.com?node_id=11129657


in reply to perlbrew: Command [ ... ] terminated with exit code 0 ($? = 13)

$? = 13 is (typically) a SIGPIPE. You probably exited less before scrolling through all the output.

Replies are listed 'Best First'.
Re^2: perlbrew: Command [ ... ] terminated with exit code 0 ($? = 13)
by rsFalse (Chaplain) on Mar 15, 2021 at 10:46 UTC
    Ye. For sure. Thanks!
    If doesn't throw a warning if I scroll whole output.

    But if I try with slightly changed line:
    perlbrew exec perl -wle 'print " A" x 1e0 for 1 .. 1e2' | less -S
    There is no warning, although I didn't scroll the whole output.
      But if I try with slightly changed line:
      perlbrew exec perl -wle 'print " A" x 1e0 for 1 .. 1e2' | less -S
      There is no warning, although I didn't scroll the whole output.

      perl -wle 'print " A" x 1e0 for 1 .. 1e2' is 300 bytes, while perl -wle 'print " A" x 1e3 for 1 .. 1e2' is 200100 bytes. Since you're piping the output of perl to another program, perl's output isn't line-based (see e.g. Suffering from Buffering), and so what I'm fairly certain is happening is that perl is simply outputting the 300 bytes in one go. Update: Because perl -wle '$|++; print " A" x 1e0 for 1 .. 1e2' isn't killed by SIGPIPE either, it may also have something to do with how much data a pipe can buffer, but I'm not an expert on that.

        I think Linux pipes can usually hold 128 KiB. This surely configurable.

        Update:

        $ perl -e' $|=1; $SIG{PIPE} = sub { die("SIGPIPE") }; print "x" x 1..15_328; ' | sleep 0.25 # Child needs to be alive when the print occurs. $ perl -e' $|=1; $SIG{PIPE} = sub { die("SIGPIPE") }; print "x" x 1..15_329; ' | sleep 0.25 SIGPIPE at -e line 3.

        It's 15,328 on my Ubuntu (over WSL2) system. What a weird number. That's 1,056 bytes less than 16 KiB (16,384).

        Seeking work! You can reach me at ikegami@adaelis.com