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

> I'd like to tackle this issue but I'm still not comfortable at the meaning
> of $() and ().


I think I may have complicated this issue by introducing $().
I no longer think $() is needed.
I think we can change <> directly to () without changing their semantics.



>
> The problem I have is whether the output should be evaluated or not.



The output i.e. stdout should not be evaluated. If we need to do capture it
RFC132 proposes a 'tac' command.
The first word after opening ( should be treated as a command and cause a
failure if the command is not found.



>
> 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:



yes, I agree.



>
>
>  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"

agree.

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

agree.

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


I think this should fail with command not found: a

If the inner evaluation is not intended to produce a command:

(echo result: (echo echo a)) => result: a

The Unix analog (which also fails) is:

bash% $($(echo echo a))
-bash: a: command not found



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


This is equivalent to (echo echo a | tac)

At first I liked the idea of removing 'tac' and replacing it with $() - but
'tac' is actually more flexible:

e.g. write to file as RFC132 doesn't provide Unix-like IO redirection:

bundles | tac -f b.txt

I have also found it useful to add 'tac --list' that returns the output as a
list, rather than a String, as this can then be iterated over using each:

each <bundles | grep felix> { echo felix bundle: $it }

Derek


>
>
> 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