public ProcessWrapper StartConsoleProcess(string command, string arguments, string workingDirectory, IConsole console, EventHandler exited)
        {
            if (console == null || (console is ExternalConsole)) {
                string additionalCommands = "";
                if (!console.CloseOnDispose)
                    additionalCommands = @"echo; read -p 'Press any key to continue...' -n1;";
                ProcessStartInfo psi = new ProcessStartInfo("xterm",
                    String.Format (@"-e ""cd {3} ; '{0}' {1} ; {2}""", command, arguments, additionalCommands, workingDirectory));
                psi.UseShellExecute = false;

                if (workingDirectory != null)
                    psi.WorkingDirectory = workingDirectory;

                psi.UseShellExecute  =  false;

                ProcessWrapper p = new ProcessWrapper();

                if (exited != null)
                    p.Exited += exited;

                p.StartInfo = psi;
                p.Start();
                return p;
            } else {
                ProcessWrapper pw = StartProcess (command, arguments, workingDirectory, console.Out, console.Error, null);
                new ProcessMonitor (console, pw, exited);
                return pw;
            }
        }
        public ProcessWrapper StartProcess(string command, string arguments, string workingDirectory, ProcessEventHandler outputStreamChanged, ProcessEventHandler errorStreamChanged, EventHandler exited)
        {
            if (command == null)
                throw new ArgumentNullException("command");

            if (command.Length == 0)
                throw new ArgumentException("command");

            ProcessWrapper p = new ProcessWrapper();

            if (outputStreamChanged != null) {
                p.OutputStreamChanged += outputStreamChanged;
            }

            if (errorStreamChanged != null)
                p.ErrorStreamChanged += errorStreamChanged;

            if (exited != null)
                p.Exited += exited;

            if(arguments == null || arguments.Length == 0)
                p.StartInfo = new ProcessStartInfo (command);
            else
                p.StartInfo = new ProcessStartInfo (command, arguments);

            if(workingDirectory != null && workingDirectory.Length > 0)
                p.StartInfo.WorkingDirectory = workingDirectory;

            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.UseShellExecute = false;
            p.EnableRaisingEvents = true;

            p.Start ();
            return p;
        }