PR #13361 missed one aspect of what is was trying to fix, namely what was originally reported in #10512:
How $? is set in an external-program call should solely depend on the process exit code, irrespective of whether there is stderr output and whether or not stderr output is redirected.
It is the latter that's still a problem, which matters primarily with respect to && and ||:
# On Unix
PS> sh -c 'ls nosuch; :' 2>$null || 'why did I get here?'
why did I get here?
Steps to reproduce
# On Unix
sh -c 'ls nosuch; :' 2>$null; $? | Should -BeTrue
Expected behavior
The test should succeed:
Since the exit code of the sh command is 0, $? should be $true - irrespective of the presence of stderr output, whether redirected or not.
Actual behavior
The test fails, because the presence of redirected stderr output unexpectedly set $? to `$false
Expected $true, but got $false.
Environment data
PowerShell Core 7.1.0-preview.5
PR #13361 missed one aspect of what is was trying to fix, namely what was originally reported in #10512:
How
$?is set in an external-program call should solely depend on the process exit code, irrespective of whether there is stderr output and whether or not stderr output is redirected.It is the latter that's still a problem, which matters primarily with respect to
&&and||:Steps to reproduce
Expected behavior
The test should succeed:
Since the exit code of the
shcommand is0,$?should be$true- irrespective of the presence of stderr output, whether redirected or not.Actual behavior
The test fails, because the presence of redirected stderr output unexpectedly set
$?to `$falseEnvironment data