def compile_fun_shell(name, line):

    extr = []
    def repl(match):
        g = match.group
        if g('dollar'): return "$"
        elif g('backslash'): return '\\\\'
        elif g('subst'): extr.append((g('var'), g('code'))); return "%s"
        return None

    line = reg_act.sub(repl, line)

    parm = []
    dvars = []
    app = parm.append
    for (var, meth) in extr:
        if var == 'SRC':
            if meth:
                app('task.inputs%s' % meth)
            else:
                app('" ".join([i.path_from(bld.bldnode) for i in task.inputs)')
        elif var == 'TGT':
            if meth:
                app('task.outputs%s' % meth)
            else:
                app('" ".join([i.path_from(bld.bldnode) for i in task.outputs)')
        else:
            if not var in dvars:
                dvars.append(var)
            app("p('%s')" % var)
    if parm:
        parm = "%% (%s) " % (',\n\t\t'.join(parm))
    else:
        parm = ''

    c = COMPILE_TEMPLATE_SHELL % (line, parm)

    return (funex(c), dvars)
Remove dead receivers from connections.
dataset/ETHPy150Open cournape/Bento/bento/private/_yaku/yaku/compiled_fun.py/compile_fun_shell--crossover with--dataset/ETHPy150Open AppScale/appscale/AppServer/lib/django-1.2/django/dispatch/dispatcher.py/Signal._remove_receiver