2009/8/17 Guillaume Nodet <gno...@gmail.com>

>
> So in short, the patch does the following:
>  * replace <> with $()
>  * use ( ) for grouping commands when on the edge of the command
>  * make the number of evaluation predictable
>  * have a syntax and semantic which is mostly (fully) in sync with bash
>  * re-evaluate / split expanded arguments that are not quoted



I can still see no reason for having () and $() as two separate operators.
This unncessarily compllicates syntax without adding any new capability.

You previously gave the following example to demonstrate the need for a
separate grouping operator:

>The grouping operator is imho needed to be able to order pipes and columns:
>  (echo a ; echo b) | tac
>  echo a ; (echo b | tac)

However, this example works fine with the existing <> execution quotes:

ka...@root> <echo a; echo b> | tac
ab
ka...@root> echo a; <echo b | tac>
a
b

Do you have any other example or use case that demonstrates the need for a
separate grouping operator?

() in bash is NOT only used for grouping - it executes the command within
(), just like the existing <>.
$() in bash executes and captures stdout into a string - equivalent to
<command args | tac> in gogo.


To try to understand the need for separate () and $() operators, I have
taken the gogo TestParser.java from the FELIX-1471.patch and replaced both
$() and () with <>. I then ran the test against the unpatched code.

All tests worked except some newly added tests within
testGroupingAndEvaluation() like:

assertEquals("a", c.execute("<echo echo a>") + "");

This fails because <echo echo a> evaluates to the String "echo a", which is
then evaluated as a command and the command 'echo a' is not found.

assertEquals("a", c.execute("$(echo echo a)") + "");

This works because of the complex re-parsing done by $() that you describe
below.

In bash, if you need to re-parse some text, you use the 'eval' command:

$ eval $(echo echo '$HOME')
/Users/derek

We could take exactly the same approach in gogo, by adding a simple eval
command for use on the rare occassions when it is required.

Derek



>
>
> I'm happy to discuss things further, but the major problem is related to
> make the evaluation predictable, which sounds easy, but is not really ...
> And this require to re-evaluate / split the expanded arguments.
> See the following example:
>        assertEquals("a", c.execute("$($(echo echo echo a)) | capture"));
> The "echo echo echo a" command is executed and prints "echo echo a". This
> result is inside $() so it has to be interpreted as a full command line,
> not
> as a single argument which would be a string "echo echo a" as this would
> return a command not found.
>
>

Reply via email to