[Scons-users] escaping brackets () in file path

Bill Deegan bill at baddogconsulting.com
Sat Feb 27 22:15:10 EST 2016


Likely you could just swap out SPAWN to not use a shell?

On Sat, Feb 27, 2016 at 7:41 AM, Carnë Draug <carandraug+dev at gmail.com>
wrote:

> On 27 February 2016 at 00:19, Plunket, Tom
> <tom.plunket at aristocrat-inc.com> wrote:
> > It's not a direct answer to your query, but can you just quote your file
> > arguments? I have to do that anyway because my users love to put spaces
> > in their filenames but it also covers other shell characters pretty well.
> > The only character I need to handle manually (presumably because I can't
> > figure out how to get env.Literal to work) is the dollar symbol $ but
> that's
> > because SCons tries to process it before it gets to the shell.
> >
>
> I tried it but it does not work.  The quotes become part of the argument.
>
>     $ cat SConstruct
>     #!/usr/bin/env python
>     # -*- coding: utf-8 -*-
>
>     Command(target='foo (bar) qux', source=None, action="touch '$TARGET'")
>
>     $ scons
>     scons: Reading SConscript files ...
>     scons: done reading SConscript files.
>     scons: Building targets ...
>     touch "'foo (bar) qux'"
>     scons: done building targets.
>
>     $ ls
>     'foo (bar) qux'  SConstruct
>
> Changing to quotes does not fix it either:
>
>     $ cat SConstruct
>     #!/usr/bin/env python
>     # -*- coding: utf-8 -*-
>
>     Command(target='foo (bar) qux', source=None, action='touch "$TARGET"')
>
>     $ scons
>     scons: Reading SConscript files ...
>     scons: done reading SConscript files.
>     scons: Building targets ...
>     touch ""foo (bar) qux""
>     sh: 1: Syntax error: "(" unexpected
>     scons: *** [foo (bar) qux] Error 2
>     scons: building terminated because of errors.
>
> I have previously bumped into similar issues where my arguments were
> regular expressions and I couldn't trust SCons to quote things correctly.
> This may be of help to you.  My solution at the time was the following:
>
>     ## Add a NoShellCommand builder to be used like Command()
>     ##
>     ## This has the advantage that there's no shell involved, saving us
>     ## from having to escape quotes, spaces, wildcards, and whatsnot.
>
>     import subprocess
>     def no_shell_command(target, source, env):
>       return subprocess.call(env['action'])
>     def no_shell_command_strfunc(target, source, env):
>       args = env['action']
>       return "$ %s " % (args[0]) + " ".join(["'%s'" % (arg) for arg in
> args[1:]])
>     no_shell_command_action = Action(no_shell_command,
> strfunction=no_shell_command_strfunc)
>     env.Append(BUILDERS={'NoShellCommand' :
> Builder(action=no_shell_command_action)})
>
> Which you can then use like this:
>
>     NoShellCommand(source = foo, target = bar, action = [prog, foo,
> bar, arg1, arg2])
>
> Carnë
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> https://pairlist4.pair.net/mailman/listinfo/scons-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20160227/ae8e86a0/attachment.html>


More information about the Scons-users mailing list