For simplicity, should we not just have () and not $(), seeing that ()
can be done with tac?
Kind regards,
Peter Kriens
On 11 aug 2009, at 14:20, Guillaume Nodet wrote:
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