This exists since Lua 5.2. The culprit is the exit code on Windows having a different format than on unix/posix. The latter has 0-255 as common ground and mostly anything else is undefined. But on Windows the exit code is a 32bit signed integer. Now this code: https://github.com/lua/lua/blob/f59e6a93c0ad38a27a420e51abf8f13d962446b5/lauxlib.c#L276-L277 Treats -1 as a special case, and goes looking for an error message here: https://github.com/lua/lua/blob/f59e6a93c0ad38a27a420e51abf8f13d962446b5/lauxlib.c#L241-L247 This results in “No error” in the windows case of -1, since it is a valid exit code. Test output (the actual exit code used, followed by the 3 results of os.execute): -6 nil exit -6 -5 nil exit -5 -4 nil exit -4 -3 nil exit -3 -2 nil exit -2 -1 nil No error 0 0 true exit 0 1 nil exit 1 2 nil exit 2 3 nil exit 3 4 nil exit 4 5 nil exit 5 On Windows the -1 case should have been “-1 nil exit -1” regards Thijs