<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<div>Been playing with this Shell for some time now, and, recently, found the parser's algorithm interesting.</div>
<div><br>
</div>
<div>Tom Christiansen's complaints on flow control regard commands executed in if statements as impossible to be redirected. Except if in a sub-shell, is really impossible. Why's that triggered an interest in finding out how control structures influence redirection.</div>
<div><br>
</div>
<div>Turns out commands in if statements have their output redirected to if itself.</div>
<div><br>
</div>
<div>if ( { echo ok | grep ok } ) then</div>
<div>  echo ok</div>
<div>endif</div>
<div><br>
</div>
<div>Will always return false. I believe because is piping to if, since</div>
<div><br>
</div>
<div>if ( { echo ok > ok } ) then > ok</div>
<div>  echo ok</div>
<div>endif</div>
<div><br>
</div>
<div>redirects OK. Somehow, botches up and redirects to if. Or curly braces alone aren't meant for complex procedures. This syntax breaks nested conditions, though.</div>
<div><br>
</div>
<div>In sub-shells, however, if the output isn't redirected, it's redirected to if as well.</div>
<div><br>
</div>
<div>The form</div>
<div><br>
</div>
<div>if >& /dev/null ( { echo ok > ok } ) then</div>
<div>  echo ok</div>
<div>endif</div>
<div><br>
</div>
<div>works too, except (and shouldn't) for pipes. But this</div>
<div><br>
</div>
<div>>& /dev/null if ( { echo ok > ok } ) then</div>
<div>  echo ok</div>
<div>endif</div>
<div><br>
</div>
<div>is an error, even though is acceptable for most (if not all) commands. Without parentheses, however, works. </div>
</body>
</html>