Thanks for your detailed follow up. I understand what is happening, and am closing this issue (please reopen if you see fit). In the closing notes, I have a suggestion (slash question), and a summary of how to use CONDITIONAL in the 'if' statement - in case it can be of use for someone reading later. ****** Suggestion / question Would it be reasonable to suggest removing existing functionality as follows: In the statement if CONDITIONAL { TRUE-COMMANDS } { FALSE-COMMANDS } The CONDITIONAL can only have the following forms: 1. ${command-call} 2. ${function-call} The currently allowed 3. {command-call} 4. (function-call) would represent syntax error. (3. is outright wrong as it brings silent invalid results) By banning 3. and 4., Would Eshell lose the ability to express any semantics that can be achieved using 1. and 2? ****** Math operations using < or < in ~if CONDITIONAL~ ~Quote < and > as \< or \> with backslash OTHERWISE YOU GET AN ERROR, OR SILENTLY INCORRECT BEHAVIOR~ inside () or $() quotes are not needed but do not hurt Examples: if ${\< 3 5} {echo YES} {echo NO} # YES -- correct if ${< 3 5} {echo YES} {echo NO} # Eshell thinks it is redirection, so WRONG if ${> 3 5} {echo YES} {echo NO} # YES - WRONG!!! (silently) if $(< 3 5) {echo YES} {echo NO} # YES -- correct if $(> 3 5) {echo YES} {echo NO} # NO -- correct if (< 3 5) {echo YES} {echo NO} # YES -- correct if (> 3 5) {echo YES} {echo NO} # NO -- correct ****** Flow control: TL;DR of ~if CONDITIONAL~ - Bad: Do NOT use ~if {function-call}~ (abbreviated, ~if {}~) - Good: Do use ~if ${function-call}~ or ~if $(function-call)~ or ~if (function-call)~ Examples" - Bad use: ~if {= 3 0} { echo YES } { echo NO }~ # YES -- WRONG!!! (silently!!) - Good use: ~if ${= 3 0} { echo YES } { echo NO }~ # NO -- correct ****** Flow control: Recipe of ~if CONDITIONAL~ In flow control ~if CONDITIONAL {TRUE-COMMANDS} {FALSE-COMMANDS}~: do NOT USE the ~{}~ BLOCK as CONDITIONAL; instead use ~the ${}~, ~$()~ or ~()~ blocks. The ~$~ versions are preferred. The above recipy also applies to ~unless~, ~while~ ~until~. (this does not apply to ~for VAR in LIST~ which is described elsewhere) Thanks, Milan