diff --git a/CHANGELOG.md b/CHANGELOG.md
index 503f15e0..f9627194 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,7 @@
     * Deleted ``cmd_with_subs_completer``, ``get_subcommands``, and ``get_subcommand_completer``
         * Replaced by default AutoCompleter implementation for all commands using argparse
     * Deleted support for old method of calling application commands with ``cmd()`` and ``self``
+    * ``cmd2.redirector`` is no longer supported. Output redirection can only be done with '>' or '>>'
 * Python 2 no longer supported
     * ``cmd2`` now supports Python 3.4+
 
diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py
index 02ae96fe..43fd99ec 100755
--- a/cmd2/cmd2.py
+++ b/cmd2/cmd2.py
@@ -338,7 +338,6 @@ class Cmd(cmd.Cmd):
     # Attributes used to configure the StatementParser, best not to change these at runtime
     blankLinesAllowed = False
     multiline_commands = []
-    redirector = '>'        # for sending output to file
     shortcuts = {'?': 'help', '!': 'shell', '@': 'load', '@@': '_relative_load'}
     aliases = dict()
     terminators = [';']
@@ -1149,29 +1148,26 @@ class Cmd(cmd.Cmd):
 
             if len(raw_tokens) > 1:
 
-                # Build a list of all redirection tokens
-                all_redirects = constants.REDIRECTION_CHARS + ['>>']
-
                 # Check if there are redirection strings prior to the token being completed
                 seen_pipe = False
                 has_redirection = False
 
                 for cur_token in raw_tokens[:-1]:
-                    if cur_token in all_redirects:
+                    if cur_token in constants.REDIRECTION_TOKENS:
                         has_redirection = True
 
-                        if cur_token == '|':
+                        if cur_token == constants.REDIRECTION_PIPE:
                             seen_pipe = True
 
                 # Get token prior to the one being completed
                 prior_token = raw_tokens[-2]
 
                 # If a pipe is right before the token being completed, complete a shell command as the piped process
-                if prior_token == '|':
+                if prior_token == constants.REDIRECTION_PIPE:
                     return self.shell_cmd_complete(text, line, begidx, endidx)
 
                 # Otherwise do path completion either as files to redirectors or arguments to the piped process
-                elif prior_token in all_redirects or seen_pipe:
+                elif prior_token in constants.REDIRECTION_TOKENS or seen_pipe:
                     return self.path_complete(text, line, begidx, endidx)
 
                 # If there were redirection strings anywhere on the command line, then we
@@ -1820,7 +1816,7 @@ class Cmd(cmd.Cmd):
 
             # We want Popen to raise an exception if it fails to open the process.  Thus we don't set shell to True.
             try:
-                self.pipe_proc = subprocess.Popen(shlex.split(statement.pipe_to), stdin=subproc_stdin)
+                self.pipe_proc = subprocess.Popen(statement.pipe_to, stdin=subproc_stdin)
             except Exception as ex:
                 # Restore stdout to what it was and close the pipe
                 self.stdout.close()
@@ -1834,24 +1830,30 @@ class Cmd(cmd.Cmd):
                 raise ex
         elif statement.output:
             if (not statement.output_to) and (not can_clip):
-                raise EnvironmentError('Cannot redirect to paste buffer; install ``xclip`` and re-run to enable')
+                raise EnvironmentError("Cannot redirect to paste buffer; install 'pyperclip' and re-run to enable")
             self.kept_state = Statekeeper(self, ('stdout',))
             self.kept_sys = Statekeeper(sys, ('stdout',))
             self.redirecting = True
             if statement.output_to:
+                # going to a file
                 mode = 'w'
-                if statement.output == 2 * self.redirector:
+                # statement.output can only contain
+                # REDIRECTION_APPEND or REDIRECTION_OUTPUT
+                if statement.output == constants.REDIRECTION_APPEND:
                     mode = 'a'
                 sys.stdout = self.stdout = open(os.path.expanduser(statement.output_to), mode)
             else:
+                # going to a paste buffer
                 sys.stdout = self.stdout = tempfile.TemporaryFile(mode="w+")
-                if statement.output == '>>':
+                if statement.output == constants.REDIRECTION_APPEND:
                     self.poutput(get_paste_buffer())
 
     def _restore_output(self, statement):
-        """Handles restoring state after output redirection as well as the actual pipe operation if present.
+        """Handles restoring state after output redirection as well as
+        the actual pipe operation if present.
 
-        :param statement: Statement object which contains the parsed input from the user
+        :param statement: Statement object which contains the parsed
+                          input from the user
         """
         # If we have redirected output to a file or the clipboard or piped it to a shell command, then restore state
         if self.kept_state is not None:
diff --git a/cmd2/constants.py b/cmd2/constants.py
index 838650e5..b829000f 100644
--- a/cmd2/constants.py
+++ b/cmd2/constants.py
@@ -4,9 +4,14 @@
 
 import re
 
-# Used for command parsing, tab completion and word breaks. Do not change.
+# Used for command parsing, output redirection, tab completion and word
+# breaks. Do not change.
 QUOTES = ['"', "'"]
-REDIRECTION_CHARS = ['|', '>']
+REDIRECTION_PIPE = '|'
+REDIRECTION_OUTPUT = '>'
+REDIRECTION_APPEND = '>>'
+REDIRECTION_CHARS = [REDIRECTION_PIPE, REDIRECTION_OUTPUT]
+REDIRECTION_TOKENS = [REDIRECTION_PIPE, REDIRECTION_OUTPUT, REDIRECTION_APPEND]
 
 # Regular expression to match ANSI escape codes
 ANSI_ESCAPE_RE = re.compile(r'\x1b[^m]*m')
diff --git a/cmd2/parsing.py b/cmd2/parsing.py
index 3a9b390b..ce15bd38 100644
--- a/cmd2/parsing.py
+++ b/cmd2/parsing.py
@@ -45,7 +45,8 @@ class Statement(str):
                             redirection, if any
     :type suffix:           str or None
     :var pipe_to:           if output was piped to a shell command, the shell command
-    :type pipe_to:          str or None
+                            as a list of tokens
+    :type pipe_to:          list
     :var output:            if output was redirected, the redirection token, i.e. '>>'
     :type output:           str or None
     :var output_to:         if output was redirected, the destination, usually a filename
@@ -283,12 +284,27 @@ class StatementParser:
                 argv = tokens
                 tokens = []
 
+        # check for a pipe to a shell process
+        # if there is a pipe, everything after the pipe needs to be passed
+        # to the shell, even redirected output
+        # this allows '(Cmd) say hello | wc > countit.txt'
+        try:
+            # find the first pipe if it exists
+            pipe_pos = tokens.index(constants.REDIRECTION_PIPE)
+            # save everything after the first pipe as tokens
+            pipe_to = tokens[pipe_pos+1:]
+            # remove all the tokens after the pipe
+            tokens = tokens[:pipe_pos]
+        except ValueError:
+            # no pipe in the tokens
+            pipe_to = None
+
         # check for output redirect
         output = None
         output_to = None
         try:
-            output_pos = tokens.index('>')
-            output = '>'
+            output_pos = tokens.index(constants.REDIRECTION_OUTPUT)
+            output = constants.REDIRECTION_OUTPUT
             output_to = ' '.join(tokens[output_pos+1:])
             # remove all the tokens after the output redirect
             tokens = tokens[:output_pos]
@@ -296,26 +312,14 @@ class StatementParser:
             pass
 
         try:
-            output_pos = tokens.index('>>')
-            output = '>>'
+            output_pos = tokens.index(constants.REDIRECTION_APPEND)
+            output = constants.REDIRECTION_APPEND
             output_to = ' '.join(tokens[output_pos+1:])
             # remove all tokens after the output redirect
             tokens = tokens[:output_pos]
         except ValueError:
             pass
 
-        # check for pipes
-        try:
-            # find the first pipe if it exists
-            pipe_pos = tokens.index('|')
-            # save everything after the first pipe
-            pipe_to = ' '.join(tokens[pipe_pos+1:])
-            # remove all the tokens after the pipe
-            tokens = tokens[:pipe_pos]
-        except ValueError:
-            # no pipe in the tokens
-            pipe_to = None
-
         if terminator:
             # whatever is left is the suffix
             suffix = ' '.join(tokens)
diff --git a/docs/freefeatures.rst b/docs/freefeatures.rst
index 95ae127c..a03a1d08 100644
--- a/docs/freefeatures.rst
+++ b/docs/freefeatures.rst
@@ -100,26 +100,8 @@ As in a Unix shell, output of a command can be redirected:
   - appended to a file with ``>>``, as in ``mycommand args >> filename.txt``
   - piped (``|``) as input to operating-system commands, as in
     ``mycommand args | wc``
-  - sent to the paste buffer, ready for the next Copy operation, by
-    ending with a bare ``>``, as in ``mycommand args >``..  Redirecting
-    to paste buffer requires software to be installed on the operating
-    system, pywin32_ on Windows or xclip_ on \*nix.
+  - sent to the operating system paste buffer, by ending with a bare ``>``, as in ``mycommand args >``. You can even append output to the current contents of the paste buffer by ending your command with ``>>``.
 
-If your application depends on mathematical syntax, ``>`` may be a bad
-choice for redirecting output - it will prevent you from using the
-greater-than sign in your actual user commands.  You can override your
-app's value of ``self.redirector`` to use a different string for output redirection::
-
-    class MyApp(cmd2.Cmd):
-        redirector = '->'
-
-::
-
-    (Cmd) say line1 -> out.txt
-    (Cmd) say line2 ->-> out.txt
-    (Cmd) !cat out.txt
-    line1
-    line2
 
 .. note::
 
@@ -136,8 +118,8 @@ app's value of ``self.redirector`` to use a different string for output redirect
    arguments after them from the command line arguments accordingly.  But output from a command will not be redirected
    to a file or piped to a shell command.
 
-.. _pywin32: http://sourceforge.net/projects/pywin32/
-.. _xclip: http://www.cyberciti.biz/faq/xclip-linux-insert-files-command-output-intoclipboard/
+If you need to include any of these redirection characters in your command,
+you can enclose them in quotation marks, ``mycommand 'with > in the argument'``.
 
 Python
 ======
diff --git a/docs/unfreefeatures.rst b/docs/unfreefeatures.rst
index a4776a53..41144c8f 100644
--- a/docs/unfreefeatures.rst
+++ b/docs/unfreefeatures.rst
@@ -10,13 +10,17 @@ commands whose names are listed in the
 parameter ``app.multiline_commands``.  These
 commands will be executed only
 after the user has entered a *terminator*.
-By default, the command terminators is
+By default, the command terminator is
 ``;``; replacing or appending to the list
 ``app.terminators`` allows different
 terminators.  A blank line
 is *always* considered a command terminator
 (cannot be overridden).
 
+In multiline commands, output redirection characters
+like ``>`` and ``|`` are part of the command
+arguments unless they appear after the terminator.
+
 
 Parsed statements
 =================

diff --git a/tests/test_cmd2.py b/tests/test_cmd2.py
index bc76505f..6e4a5a3e 100644
--- a/tests/test_cmd2.py
+++ b/tests/test_cmd2.py
@@ -1430,7 +1430,7 @@ def test_clipboard_failure(capsys):
     # Make sure we got the error output
     out, err = capsys.readouterr()
     assert out == ''
-    assert 'Cannot redirect to paste buffer; install ``xclip`` and re-run to enable' in err
+    assert "Cannot redirect to paste buffer; install 'pyperclip' and re-run to enable" in err
 
 
 class CmdResultApp(cmd2.Cmd):
diff --git a/tests/test_parsing.py b/tests/test_parsing.py
index bfb55b23..41966c71 100644
--- a/tests/test_parsing.py
+++ b/tests/test_parsing.py
@@ -159,7 +159,7 @@ def test_parse_simple_pipe(parser, line):
     assert statement.command == 'simple'
     assert not statement.args
     assert statement.argv == ['simple']
-    assert statement.pipe_to == 'piped'
+    assert statement.pipe_to == ['piped']
 
 def test_parse_double_pipe_is_not_a_pipe(parser):
     line = 'double-pipe || is not a pipe'
@@ -177,7 +177,7 @@ def test_parse_complex_pipe(parser):
     assert statement.argv == ['command', 'with', 'args,', 'terminator']
     assert statement.terminator == '&'
     assert statement.suffix == 'sufx'
-    assert statement.pipe_to == 'piped'
+    assert statement.pipe_to == ['piped']
 
 @pytest.mark.parametrize('line,output', [
     ('help > out.txt', '>'),
@@ -227,9 +227,9 @@ def test_parse_pipe_and_redirect(parser):
     assert statement.argv == ['output', 'into']
     assert statement.terminator == ';'
     assert statement.suffix == 'sufx'
-    assert statement.pipe_to == 'pipethrume plz'
-    assert statement.output == '>'
-    assert statement.output_to == 'afile.txt'
+    assert statement.pipe_to == ['pipethrume', 'plz', '>', 'afile.txt']
+    assert not statement.output
+    assert not statement.output_to
 
 def test_parse_output_to_paste_buffer(parser):
     line = 'output to paste buffer >> '
@@ -240,8 +240,9 @@ def test_parse_output_to_paste_buffer(parser):
     assert statement.output == '>>'
 
 def test_parse_redirect_inside_terminator(parser):
-    """The terminator designates the end of the commmand/arguments portion.  If a redirector
-    occurs before a terminator, then it will be treated as part of the arguments and not as a redirector."""
+    """The terminator designates the end of the commmand/arguments portion.
+    If a redirector occurs before a terminator, then it will be treated as
+    part of the arguments and not as a redirector."""
     line = 'has > inside;'
     statement = parser.parse(line)
     assert statement.command == 'has'
@@ -385,7 +386,7 @@ def test_parse_alias_pipe(parser, line):
     statement = parser.parse(line)
     assert statement.command == 'help'
     assert not statement.args
-    assert statement.pipe_to == 'less'
+    assert statement.pipe_to == ['less']
 
 def test_parse_alias_terminator_no_whitespace(parser):
     line = 'helpalias;'

Cmd2.redirector isn't honored any more, either make it work or deprecate it
With the merge of PR #370, `Cmd2.redirector` is no longer honored: the redirector symbol is currently hard-coded as '>'. The documentation still states that you can set `Cmd2.redirector` to something like '->' and have the parsing logic honor that change. We need to either fix the code to match the documentation, or deprecate the attribute and fix the documentation to say that you can't change the redirector.

Related to #392.
tests/test_cmd2.py::test_clipboard_failure tests/test_parsing.py::test_parse_simple_pipe[simple tests/test_parsing.py::test_parse_simple_pipe[simple|piped] tests/test_parsing.py::test_parse_complex_pipe tests/test_parsing.py::test_parse_pipe_and_redirect tests/test_parsing.py::test_parse_alias_pipe[helpalias tests/test_parsing.py::test_parse_alias_pipe[helpalias|less]
tests/test_cmd2.py::test_ver tests/test_cmd2.py::test_empty_statement tests/test_cmd2.py::test_base_help tests/test_cmd2.py::test_base_help_verbose tests/test_cmd2.py::test_base_help_history tests/test_cmd2.py::test_base_argparse_help tests/test_cmd2.py::test_base_shortcuts tests/test_cmd2.py::test_base_show tests/test_cmd2.py::test_base_show_long tests/test_cmd2.py::test_base_show_readonly tests/test_cmd2.py::test_cast tests/test_cmd2.py::test_cast_problems tests/test_cmd2.py::test_base_set tests/test_cmd2.py::test_set_not_supported tests/test_cmd2.py::test_set_quiet tests/test_cmd2.py::test_base_shell tests/test_cmd2.py::test_base_py tests/test_cmd2.py::test_base_run_python_script tests/test_cmd2.py::test_base_run_pyscript tests/test_cmd2.py::test_recursive_pyscript_not_allowed tests/test_cmd2.py::test_pyscript_with_nonexist_file tests/test_cmd2.py::test_pyscript_with_exception tests/test_cmd2.py::test_pyscript_requires_an_argument tests/test_cmd2.py::test_base_error tests/test_cmd2.py::test_history_span tests/test_cmd2.py::test_history_get tests/test_cmd2.py::test_base_history tests/test_cmd2.py::test_history_script_format tests/test_cmd2.py::test_history_with_string_argument tests/test_cmd2.py::test_history_with_integer_argument tests/test_cmd2.py::test_history_with_integer_span tests/test_cmd2.py::test_history_with_span_start tests/test_cmd2.py::test_history_with_span_end tests/test_cmd2.py::test_history_with_span_index_error tests/test_cmd2.py::test_history_output_file tests/test_cmd2.py::test_history_edit tests/test_cmd2.py::test_history_run_all_commands tests/test_cmd2.py::test_history_run_one_command tests/test_cmd2.py::test_base_load tests/test_cmd2.py::test_load_with_empty_args tests/test_cmd2.py::test_load_with_nonexistent_file tests/test_cmd2.py::test_load_with_empty_file tests/test_cmd2.py::test_load_with_binary_file tests/test_cmd2.py::test_load_with_utf8_file tests/test_cmd2.py::test_load_nested_loads tests/test_cmd2.py::test_base_runcmds_plus_hooks tests/test_cmd2.py::test_base_relative_load tests/test_cmd2.py::test_relative_load_requires_an_argument tests/test_cmd2.py::test_output_redirection tests/test_cmd2.py::test_feedback_to_output_true tests/test_cmd2.py::test_feedback_to_output_false tests/test_cmd2.py::test_allow_redirection tests/test_cmd2.py::test_pipe_to_shell tests/test_cmd2.py::test_pipe_to_shell_error tests/test_cmd2.py::test_base_timing tests/test_cmd2.py::test_base_debug tests/test_cmd2.py::test_base_colorize tests/test_cmd2.py::test_edit_no_editor tests/test_cmd2.py::test_edit_file tests/test_cmd2.py::test_edit_file_with_spaces tests/test_cmd2.py::test_edit_blank tests/test_cmd2.py::test_base_py_interactive tests/test_cmd2.py::test_exclude_from_history tests/test_cmd2.py::test_base_cmdloop_with_queue tests/test_cmd2.py::test_base_cmdloop_without_queue tests/test_cmd2.py::test_cmdloop_without_rawinput tests/test_cmd2.py::test_precmd_hook_success tests/test_cmd2.py::test_precmd_hook_failure tests/test_cmd2.py::test_interrupt_quit tests/test_cmd2.py::test_interrupt_noquit tests/test_cmd2.py::test_default_to_shell_unknown tests/test_cmd2.py::test_default_to_shell_good tests/test_cmd2.py::test_default_to_shell_failure tests/test_cmd2.py::test_ansi_prompt_not_esacped tests/test_cmd2.py::test_ansi_prompt_escaped tests/test_cmd2.py::test_custom_command_help tests/test_cmd2.py::test_custom_help_menu tests/test_cmd2.py::test_help_undocumented tests/test_cmd2.py::test_help_overridden_method tests/test_cmd2.py::test_help_cat_base tests/test_cmd2.py::test_help_cat_verbose tests/test_cmd2.py::test_select_options tests/test_cmd2.py::test_select_invalid_option tests/test_cmd2.py::test_select_list_of_strings tests/test_cmd2.py::test_select_list_of_tuples tests/test_cmd2.py::test_select_uneven_list_of_tuples tests/test_cmd2.py::test_help_with_no_docstring tests/test_cmd2.py::test_which_editor_good tests/test_cmd2.py::test_which_editor_bad tests/test_cmd2.py::test_multiline_complete_empty_statement_raises_exception tests/test_cmd2.py::test_multiline_complete_statement_without_terminator tests/test_cmd2.py::test_cmdresult tests/test_cmd2.py::test_is_text_file_bad_input tests/test_cmd2.py::test_eof tests/test_cmd2.py::test_eos tests/test_cmd2.py::test_echo tests/test_cmd2.py::test_pseudo_raw_input_tty_rawinput_true tests/test_cmd2.py::test_pseudo_raw_input_tty_rawinput_false tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_true_echo_true tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_true_echo_false tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_false_echo_true tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_false_echo_false tests/test_cmd2.py::test_raw_input tests/test_cmd2.py::test_stdin_input tests/test_cmd2.py::test_empty_stdin_input tests/test_cmd2.py::test_poutput_string tests/test_cmd2.py::test_poutput_zero tests/test_cmd2.py::test_poutput_empty_string tests/test_cmd2.py::test_poutput_none tests/test_cmd2.py::test_alias tests/test_cmd2.py::test_alias_lookup_invalid_alias tests/test_cmd2.py::test_unalias tests/test_cmd2.py::test_unalias_all tests/test_cmd2.py::test_unalias_non_existing tests/test_cmd2.py::test_create_invalid_alias[">"] tests/test_cmd2.py::test_create_invalid_alias["no>pe"] tests/test_cmd2.py::test_create_invalid_alias["no tests/test_cmd2.py::test_create_invalid_alias["nopipe|"] tests/test_cmd2.py::test_create_invalid_alias["noterm;"] tests/test_cmd2.py::test_create_invalid_alias[noembedded"quotes] tests/test_cmd2.py::test_ppaged tests/test_cmd2.py::test_parseline_empty tests/test_cmd2.py::test_parseline tests/test_parsing.py::test_parse_empty_string tests/test_parsing.py::test_tokenize[command-tokens0] tests/test_parsing.py::test_tokenize[command tests/test_parsing.py::test_tokenize[42 tests/test_parsing.py::test_tokenize[l-tokens4] tests/test_parsing.py::test_tokenize[termbare tests/test_parsing.py::test_tokenize[termbare; tests/test_parsing.py::test_tokenize[termbare& tests/test_parsing.py::test_tokenize[help|less-tokens9] tests/test_parsing.py::test_tokenize[l|less-tokens10] tests/test_parsing.py::test_tokenize_unclosed_quotes tests/test_parsing.py::test_command_and_args[tokens0-None-None] tests/test_parsing.py::test_command_and_args[tokens1-command-None] tests/test_parsing.py::test_command_and_args[tokens2-command-arg1 tests/test_parsing.py::test_parse_single_word[plainword] tests/test_parsing.py::test_parse_single_word["one tests/test_parsing.py::test_parse_single_word['one tests/test_parsing.py::test_parse_word_plus_terminator[termbare;-;] tests/test_parsing.py::test_parse_word_plus_terminator[termbare tests/test_parsing.py::test_parse_word_plus_terminator[termbare&-&] tests/test_parsing.py::test_parse_suffix_after_terminator[termbare; tests/test_parsing.py::test_parse_suffix_after_terminator[termbare tests/test_parsing.py::test_parse_suffix_after_terminator[termbare& tests/test_parsing.py::test_parse_command_with_args tests/test_parsing.py::test_parse_command_with_quoted_args tests/test_parsing.py::test_parse_command_with_args_terminator_and_suffix tests/test_parsing.py::test_parse_hashcomment tests/test_parsing.py::test_parse_c_comment tests/test_parsing.py::test_parse_c_comment_empty tests/test_parsing.py::test_parse_what_if_quoted_strings_seem_to_start_comments tests/test_parsing.py::test_parse_double_pipe_is_not_a_pipe tests/test_parsing.py::test_parse_redirect[help tests/test_parsing.py::test_parse_redirect[help>out.txt->] tests/test_parsing.py::test_parse_redirect[help>>out.txt->>] tests/test_parsing.py::test_parse_redirect_with_args tests/test_parsing.py::test_parse_redirect_with_dash_in_path tests/test_parsing.py::test_parse_redirect_append tests/test_parsing.py::test_parse_output_to_paste_buffer tests/test_parsing.py::test_parse_redirect_inside_terminator tests/test_parsing.py::test_parse_unfinished_multiliine_command tests/test_parsing.py::test_parse_multiline_command_ignores_redirectors_within_it[multiline tests/test_parsing.py::test_parse_multiline_with_incomplete_comment tests/test_parsing.py::test_parse_multiline_with_complete_comment tests/test_parsing.py::test_parse_multiline_termninated_by_empty_line tests/test_parsing.py::test_parse_multiline_ignores_terminators_in_comments tests/test_parsing.py::test_parse_command_with_unicode_args tests/test_parsing.py::test_parse_unicode_command tests/test_parsing.py::test_parse_redirect_to_unicode_filename tests/test_parsing.py::test_parse_unclosed_quotes tests/test_parsing.py::test_empty_statement_raises_exception tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[helpalias-help-None] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[helpalias tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[42-theanswer-None] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[42 tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[!ls-shell-ls] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[!ls tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[l-shell-ls tests/test_parsing.py::test_parse_alias_on_multiline_command tests/test_parsing.py::test_parse_alias_redirection[helpalias tests/test_parsing.py::test_parse_alias_redirection[helpalias>out.txt->] tests/test_parsing.py::test_parse_alias_redirection[helpalias>>out.txt->>] tests/test_parsing.py::test_parse_alias_terminator_no_whitespace tests/test_parsing.py::test_parse_command_only_command_and_args tests/test_parsing.py::test_parse_command_only_emptyline tests/test_parsing.py::test_parse_command_only_strips_line tests/test_parsing.py::test_parse_command_only_expands_alias tests/test_parsing.py::test_parse_command_only_expands_shortcuts tests/test_parsing.py::test_parse_command_only_quoted_args tests/test_parsing.py::test_parse_command_only_specialchars[helpalias tests/test_parsing.py::test_parse_command_only_specialchars[helpalias>out.txt] tests/test_parsing.py::test_parse_command_only_specialchars[helpalias>>out.txt] tests/test_parsing.py::test_parse_command_only_specialchars[help|less] tests/test_parsing.py::test_parse_command_only_specialchars[helpalias;] tests/test_parsing.py::test_parse_command_only_none[;] tests/test_parsing.py::test_parse_command_only_none[>] tests/test_parsing.py::test_parse_command_only_none['] tests/test_parsing.py::test_parse_command_only_none["] tests/test_parsing.py::test_parse_command_only_none[|]