[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