func execute(command string, shell string, interactive bool, pseudoTTY bool) { err := utils.Exec(command, string(shell), interactive, pseudoTTY, os.Stdin, os.Stdout, os.Stderr) if err != nil { os.Exit(utils.GetStatusCode(err)) } }
// Tee implements t (trace, tee) command. func Tee(input string, interactive bool, pseudoTTY bool, env *environments.Environment) { output, err := ioutil.TempFile(env.TmpDir, "ah") if err != nil { utils.Logger.Panic("Cannot create temporary file") } bufferedOutput := bufio.NewWriter(output) gzippedWrapper := utils.NewSynchronizedWriter(gzip.NewWriter(bufferedOutput)) combinedStdout := io.MultiWriter(os.Stdout, gzippedWrapper) combinedStderr := io.MultiWriter(os.Stderr, gzippedWrapper) var commandError *exec.ExitError defer func() { // defer here because command may cause a panic but we do not want to lose any output gzippedWrapper.Close() bufferedOutput.Flush() output.Close() if hash, err := getPreciseHash(input, env); err == nil { err = os.Rename(output.Name(), env.GetTraceFileName(hash)) if err != nil { utils.Logger.Errorf("Cannot save trace: %v. Get it here: %s", err, output.Name()) } else { os.Remove(output.Name()) } } else { utils.Logger.Errorf("Error occured on fetching command number: %v", err) } if commandError != nil { os.Exit(utils.GetStatusCode(commandError)) } }() commandError = utils.Exec(input, string(env.Shell), interactive, pseudoTTY, os.Stdin, combinedStdout, combinedStderr) }