docs: def execute(self, capture_output=False, fail_fast=False, cmdline=None, lastcsums=None, **kwargs):
          """
          Pass in the kwargs as --<name> <value> pairs.
          :param capture_output: if True then return output of script in return dict. If False, only return code
          :param fail_fast:if True then quit execution after first non-zero return code, else execute all
          :returns list of (script, returncode, stdout) tuples in order of execution
          """
  
          currcsums = self.csums()
          
          scripts = self.get_scripts()
          output = []
  
          for script in scripts:
              if not os.access(script, os.R_OK ^ os.X_OK) or re.match(".*~$", script):
                  # Skip any that are not executable (e.g. README or txt files)
                  continue
  
              if lastcsums:
                  if (script in currcsums and script in lastcsums) and currcsums[script] == lastcsums[script]:
                      # skip if the analyzer has not changed since the last time it was run
                      self._logger.debug("Skipping analyzer %s since this analyzer version has already executed in the past" % script)
                      continue
  
              self._logger.debug('Executing script: %s' % script)
  
              try:
                  csum = currcsums[script]
              except:
                  csum = "N/A"
  
              if cmdline:
                  cmd = [script] + cmdline.split()
              else:
                  cmd = [script]
  
              if capture_output:
                  try:
                      outstr = subprocess.check_output(cmd, stderr=subprocess.STDOUT, **kwargs)
                      outstr = outstr.decode('utf8')
                      #outstr = rawstr.encode('utf8')
                      output.append((' '.join(cmd), 0, outstr))
                  except subprocess.CalledProcessError as e:
                      outstr = e.output.decode('utf8')
                      #outstr = rawstr.encode('utf8')
                      output.append((' '.join(cmd), e.returncode, outstr))
              else:
                  output.append((' '.join(cmd), subprocess.call(cmd, **kwargs), None))
  
              self._logger.debug('%s return code %d' % (output[-1][0], output[-1][1]))
              if output[-1][2]:
                  self._logger.debug('%s output:' % (script))
                  for l in output[-1][2].splitlines():
                      l = l.strip()
                      self._logger.debug('%s | %s' % (script, l))
  
              if fail_fast and output[-1][1]:
                  break
  
          return output