I'd like to tackle this issue but I'm still not comfortable at the meaning
of $() and ().
The problem I have is whether the output should be evaluated or not.

For example, if we consider () to be equivalent to <>

 echo a          => "a"
 echo echo a     => "echo a"
 echo a ; echo b => "ab"

Now, when using parenthesis, we have the following options

 (echo echo a)   => "a"  or "echo a"

I think it should be "echo a", else we can't really use it for grouping
commands for piping:

 e = { echo $0 } ; (e a   b | capture)

This would fail because "e a  b" would be evaluated to "a", then capture,
but the resulting value is not a command, so a command not found exception
would be thrown.

I think it would be more intuitive for the evaluation to be the
differenciator between () and $().
So we'd have:

 echo echo a     => "echo a"
  (echo echo a)   => "echo a"
  ((echo echo a)) => "echo a"
  $(echo echo a)  => "a"

Thoughts ?

On Wed, Jul 22, 2009 at 12:43, Hiram Chirino<chir...@gmail.com> wrote:
> On Fri, Jul 17, 2009 at 7:25 AM, Derek Baum <derek.b...@paremus.com>
wrote:
>
>> In RFC132, although <> are compared to shell backquotes, there are
actually
>> just executing the command,
>> and not capturing its output as done by shell backquotes, so I agree that
>> <>
>> should become () and not $().
>>
>> Some background to help clarify:
>>
>> In Unix shells, parenthesis () are used to run commands in a subshell, so
>> for example, all output goes to the pipe:
>>
>> $ echo one; echo two | nl
>> one
>>     1  two
>>
>> $ (echo one; echo two) | nl
>>     1  one
>>     2  two
>>
>> $() is the modern equivalent of backquotes `` in Unix shells, and can be
>> nested.
>>
>> It is also logical: () runs a group of commands and $() captures the
result
>> as a string:
>>
>> $ hg paths default
>> ssh://h...@hg.paremus.com:24/posh
>> $ project=$(basename $(hg paths default))
>> $ echo $project
>> posh
>>
>> However in RFC132, we rarely need to capture output as strings - we can
use
>> the returned objects directly,
>> so the above could look like this in RFC132:
>>
>> > project = (basename (hg paths default))
>>
>> or if 'hg paths default' returned a File object:
>>
>> > project = (hg paths default) getName
>>
>>
>> Shell backquotes are similar to the 'tac' command in RFC132, which
captures
>> the output of a command and returns it as a string:
>>
>> assuming grep prints to stdout and returns boolean to indicate whether it
>> found a match:
>>
>> This sets b to the boolean result of grep:
>>
>> % b = <bundles | grep felix>
>> 000000 ACT org.apache.felix.framework-1.8.1
>> % echo $b
>> true
>>
>> We can use tac to capture the output of grep as a string:
>>
>> % b = <bundles | grep felix | tac>
>> % echo $b
>> 000000 ACT org.apache.felix.framework-1.8.1true
>>
>> We _could_ instead define $() to capture output, as it does in Unix:
>>
>> % b = $(bundles | grep felix)
>>
>> Derek
>>
>
> +1.  The fact of the matter is the 'casual' users of the shell will NOT be
> aware of the more powerful underlying type system that is available via
> arguments and return types.  These users will prefer to work with stdout
> results since it's output is 'self-documenting'.  Support for constructs
> like $(...) will make these kinds of user's lives easier.
>
>
>
>>
>>
>>
>>
>> 2009/7/17 Peter Kriens <peter.kri...@aqute.biz>
>>
>> > I am not sure I see why we need $( ... ) for evaluation, instead of (
...
>> > )?
>> >
>> > Kind regards,
>> >
>> >        Peter Kriens
>> >
>> >
>> >
>> >
>> >
>> > On 16 jul 2009, at 16:22, Derek Baum wrote:
>> >
>> >  2009/7/16 Peter Kriens <peter.kri...@aqute.biz>
>> >>
>> >>
>> >>> I do agree that we should replace the <> with (). This makes a lot of
>> >>> sense
>> >>> and there are not that many filters in use anyway. We could now make
>> >>> filters
>> >>> <> if we want.
>> >>>
>> >>> [snip]
>> >>>
>> >>> About the priority of | and ; ... I remember thinking long and hard
>> about
>> >>> this but forgot why I picked this model, it still seems slightly more
>> >>> powerful because the newline acts as a ';' with a higher priority
than
>> >>> the
>> >>> '|' but I am not opposed to switching the priority.
>> >>>
>> >>
>> >>
>> >> if we agree to use $() for command execution instead of <>
>> >> then we can use () for command grouping, and thus the examples below
>> would
>> >> work the same in Unix or RFC132 shell:
>> >>
>> >> echo a; echo b | cat
>> >> (echo a; echo b) | cat
>> >>
>> >> We could also add a converter to coerce a string into an LDAP filter
to
>> >> make
>> >> up for stealing the ().
>> >>
>> >>
>> >>
>> >>  I am not sure about throwing an error when a command is not
recognized.
>> >>> Using its value seems sufficient to me and has some advantages. I do
>> not
>> >>> think this would ever confuse me.
>> >>>
>> >>
>> >>
>> >> It has already confused users on Karaf :-)
>> >>
>> >> A 'command not found' error only occurs if you pass an argument to an
>> >> unknown command, otherwise it silently evaluates to itself.
>> >>
>> >> Although this may be apparent to a user at the console, it would be
much
>> >> more difficult to diagnose in a script containing a mis-spelled
command.
>> >>
>> >> I have attached a simple patch to experiment with this to
>> >> https://issues.apache.org/jira/browse/FELIX-1325
>> >>
>> >> This patch simply avoids re-evaluating a single argument to an
>> assignment,
>> >> so
>> >>
>> >> x = hello
>> >>
>> >> works as before, but when evaluated in a non-assignment context, it
>> fails
>> >> if
>> >> a 'hello' command is not found.
>> >>
>> >> Variable expansion using ${ab} rather than $ab is still problematic.
>> >>
>> >> the ${ab} notation is in common usage:
>> >>
>> >>  - Unix allows it to delimit the variable name from following text
>> >>  - Many Java programs interpret ${xx} as expansion of system
properties
>> >>
>> >> It also works in the RFC132 shell, but in this case {ab} defines a
>> closure
>> >> and the $ evaulates it.
>> >>
>> >> If you really wanted to capture the result of executing ab, then <ab>
or
>> >> our
>> >> proposed $(ab) is the way to go.
>> >>
>> >> This would then allow us to interpret ${ab}, according to its comon
>> usage
>> >> -
>> >> enhanced variable expansion.
>> >> We could also usefully add the Unix variable expansion:
${var:-default}
>> >>
>> >> Derek
>> >>
>> >>
>> >>
>> >>>
>> >>> Nice to get some discussion going! However, please note that this is
an
>> >>> OSGi RFC. I will update the RFC in the coming weeks and discuss it in
>> >>> CPEG.
>> >>> I hope to schedule it then for inclusion in an upcoming compendium.
>> >>>
>> >>> I'd like to add one more thing. In Blueprint we spent a lot of time
on
>> >>> type
>> >>> conversion and I like very much what we got there. I think it would
be
>> a
>> >>> good idea to use the same type converters, especially because they
also
>> >>> handle generics when available.
>> >>>
>> >>
>> >>
>> >>
>> >>> Kind regards,
>> >>>
>> >>>      Peter Kriens
>> >>>
>> >>>
>> >>>
>> >
>>
>
>
>
> --
> Regards,
> Hiram
>
> Blog: http://hiramchirino.com
>
> Open Source SOA
> http://fusesource.com/
>



-- 
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to