> an arcane shell expression

Hey now, I happen to think that the $() syntax is much more elegant than 
those awkward backticks ;-)


Paul Krizak                         7171 Southwest Pkwy MS B200.3A
Senior Systems Engineer             Austin, TX  78735
Advanced Micro Devices              Desk:  (512) 602-8775
Linux/Unix Systems Engineering      Cell:  (512) 791-0686
Silicon Design Division             Fax:   (512) 602-0468

On 12/11/09 12:33, Mark Burgess wrote:
>
> Ok, I have examined this further and you are correct that there is a problem 
> in mistaking
> an arcane shell expression for an unexpanded variable. This is nothing to do 
> with the
> parser, it occurs in validation, but I've fixed this at least for new class 
> of cases
>
> You may confirm that the current svn works with this code:
>
> body common control
> {
> bundlesequence =>  {"configurePhase"};
> }
>
> bundle agent configurePhase
> {
> classes:
>
>   "defs" expression =>  returnszero("/bin/echo $(const.dollar)(/bin/cat 
> /etc/passwd)>
> /dev/null","useshell");
>
> #commands:
> #  "/bin/echo $(const.dollar)(/bin/cat /etc/passwd)"
> #      contain =>  shell;
>
> reports:
>
>    defs::
>
>       "returned zero";
>
>   !defs::
>
>       "no shell";
> }
>
> body contain shell
> {
> useshell =>  "true";
> }
>
> Jean-Noël Rivasseau wrote:
>> Mark,
>>
>> this is indeed a bug. Read carefully my example and try it. It fails because 
>> of the ${const.dollar}(cat /etc/hosts), eg
>> only because ${const.dollar} is followed by  ( ... ). In your example you 
>> don't have that, $(const.dollar)y works fine
>> because it does not reproduce the bug at all. With my example, cf-engine 
>> will *refuse* to run the command and launch the
>> shell.
>>
>> Please try with my example and see for yourself.
>>
>>> This is not a bug in cfengine, it is the shell that is turning the $ into 
>>> nothing.
>>> Cfengine interprets the string correctly and passes it to the shell as this 
>>> shows.
>>>
>>>    "MyClass" expression =  "MyClass" expression =>  returnszero("/bin/echo x
>>> $(const.dollar)y", "useshell");
>>>
>>> x
>>>
>>>> returnszero("/bin/echo x $(const.dollar)y", "noshell");
>>> x $y
>>>
>>>
>>> Jean-Noël Rivasseau wrote:
>>>> Hello, I discussed this issue in the help ML before but it really
>>>> appears like it is a bug.
>>>>
>>>> Basically, cf-engine chokes on ${const.dollar}( ... ) in command strings
>>>> passed to returnszero function. However $() in a shell (Bash) can be
>>>> very useful as it triggers a subshell. There is a bug in the parser
>>>> somewhere as this example demonstrates:
>>>>
>>>> body common control
>>>> {
>>>>      bundlesequence =>  {"configurePhase"};
>>>> }
>>>>
>>>> bundle agent configurePhase
>>>> {
>>>>          classes:
>>>>                  "MyClass" expression =>  returnszero("/bin/echo
>>>> ${const.dollar}(cat /etc/hosts)", "useshell");
>>>>                  "MyClass2" expression =>  returnszero("/bin/echo `cat
>>>> /etc/hosts`", "useshell");
>>>>          reports:
>>>>          MyClass::
>>>>                  "Hi World";
>>>>          MyClass2::
>>>>                  "Hello World";
>>>> }
>>>>
>>>>
>>>> MyClass2 will correctly be defined, but not MyClass as cf-engine will
>>>> refuse to run the first command - the parser gets confused and attempts
>>>> to solve 'cat /etc/hosts' as a variable it seems. I checked this on
>>>> today's SVN and the problem is still present. Please correct it :)
>>>>
>>>> Cheers
>>>> Jean-Noel
>

_______________________________________________
Bug-cfengine mailing list
Bug-cfengine@cfengine.org
https://cfengine.org/mailman/listinfo/bug-cfengine

Reply via email to