Evaluate the given job and return a complete shell script to be run
        by the job manager.

def eval(self):
        """ Evaluate the given job and return a complete shell script to be run
        by the job manager.
        """
        eval = []
        for part in self.parts:
            try:
                result = part.eval()
            except AttributeError:
                result = part
            if result[-1] != '\n':
                result += ' '
            eval.append(result)
        return ''.join(eval).strip()