change runner to return string, error rather than just the string, and always return the combined output of commands