On Mon, Dec 14, 2009 at 4:08 PM, erik quanstrom <quans...@quanstro.net> wrote: >> Unfortunately after playing a little bit more with rc, and trying >> it's syntax and semantics to the limit, I've also found other nasty >> bugs (some of which I've fixed, other I was not able to do so)... > > what nasty bugs? could you give some specifics.
One for example (I think it is a bug, but maybe in the semantics you've described it's not): * again if we're using `-e`, and inside a function we write `fn dosomething { echo 1 ; false ; echo 2 ; return 0 ; }` * if we run `dosomething` it shall output only `1`, as the false breaks the execution; * but if we run `dosomething || echo 3`, we see `1 2` outputed, because the false is not exiting the shell as the invocation of the function is part of a `||` statement; But undoubtedly, the following is a bug (I have an array and want to display all the elements on a single line, wrapped inside quotes, and everything with a prefix and a suffix): ~~~~ application__erl_files__short=( a.erl b.erl c.erl ) application__erl_files__long=( /home/ciprian/workbench/vel/a.erl /home/ciprian/workbench/vel/b.erl /home/ciprian/workbench/vel/c.erl ) ifs='\n' echo ' erl files = ('^`{ echo -n '`'^$application__erl_files__short^'`' }^')' ifs='\n' echo ' erl files = ('^`{ echo -n '`'^$application__erl_files__long^'`' }^')' ~~~~ it displays: ~~~~ erl files = (`a.erl` `b.erl` `c.erl`) erl files = (`/home/cipria) erl files = (/workbe) erl files = (ch/vel/a.erl` `/home/cipria) erl files = (/workbe) erl files = (ch/vel/b.erl` `/home/cipria) erl files = (/workbe) erl files = (ch/vel/c.erl`) ~~~~ See the second line of the output. It's wrong. I think there is a buffer overrun problem... >> By the way, what is the expected outcome of the following snippet >> of code when the `-e` (exit on non-0 exit code) is on: >> >> { echo 1 ; false ; echo 2 } || echo 3 >> >> Case a) it should print `1` and exit because the false in the >> middle of the block just failed; >> Case b) it should print `1`, and then `2`, because `false` is >> inside a block that is part of a `||` command; >> Case c) it should print `1`, and then `3`, because `false` has >> stopped the evaluation of the block, and made the entire block exit >> code be `1`. > > that's not a bug. -e is only evaluated at the end of a full rc > production. in yiour case, there is only one production and > it $status is '' (true) at the end of it. since echo 3 sets status > to true. > > - erik Even though I understand your reasoning, I see `-e` more as a "accept no errors from commands, and treat any non-0-exit code as an unhandled exception, except :) if its part of an if, &&, or || construct". (I see it as an equivalent for try-throw-except...) Ciprian.