docs: def build_command(self, parameter_values, command=None):
          """
          Build the command for this step using the given parameter values.
  
          Even if the original configuration only declared a single `command`,
          this function will return a list of shell commands.  It is the caller's
          responsibility to concatenate them, likely using the semicolon or
          double ampersands.
  
          It is also possible to override the `command`.
  
          :param parameter_values: Parameter values to augment any parameter defaults.
          :type parameter_values: dict[str, object]
          :param command: Overriding command; leave falsy to not override.
          :type command: str|list[str]|None
          :return: list of commands
          :rtype: list[str]
          """
          command = (command or self.command)
  
          # merge defaults with passed values
          # ignore flag default values as they are special
          # undefined flag will remain undefined regardless of default value
          values = dict(self.get_parameter_defaults(include_flags=False), **parameter_values)
  
          parameter_map = ParameterMap(parameters=self.parameters, values=values)
          return build_command(command, parameter_map)