I included tests for all return values of sysread except "error in parameters". That includes a couple of Xfail tests for the $REPLY value. The doc says: ... The result of the read is stored in PARAM or REPLY if that is not given. ... If OUTFD is given, an attempt is made to write all the bytes just read to the file descriptor OUTFD. If this fails, ... the bytes read but not written are stored in the parameter named by PARAM if supplied .... If it was successful, COUNTVAR contains the full number of bytes transferred, as usual, and PARAM is not set. This doesn't really specify what happens when $REPLY (or the PARAM) already has a value before sysread is called. As currently implemented, the value (or unset-ness) is unchanged when the return status does not require that anything be assigned, so it's necessary to either carefully (un)set these parameters before calling sysread, or to test the return status before using them.