use exec() for secondary commands so we can capture output. Also cleaned
up workflow for run() and exec_cmd() to be much cleaner.