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 -- Mark Burgess ------------------------------------------------- Professor of Network and System Administration Oslo University College, Norway Personal Web: http://www.iu.hio.no/~mark Office Telf : +47 22453272 ------------------------------------------------- _______________________________________________ Bug-cfengine mailing list Bug-cfengine@cfengine.org https://cfengine.org/mailman/listinfo/bug-cfengine