]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20180628 snapshot
authorChet Ramey <chet.ramey@case.edu>
Mon, 9 Jul 2018 14:35:17 +0000 (10:35 -0400)
committerChet Ramey <chet.ramey@case.edu>
Mon, 9 Jul 2018 14:35:17 +0000 (10:35 -0400)
15 files changed:
CWRU/CWRU.chlog
MANIFEST
bashhist.c
configure
configure.ac
general.h
lib/readline/doc/hstech.texi
lib/readline/doc/hsuser.texi
lib/readline/doc/version.texi
lib/readline/histexpand.c
lib/readline/history.h
parse.y
tests/histexp.right
tests/histexp.tests
tests/histexp6.sub [new file with mode: 0644]

index 69a8ffce55d9c62abc6f0747509c2f11a7c5f3fd..665bb88335064add08f0ff0f8ba99914ddef1c3a 100644 (file)
@@ -3424,7 +3424,7 @@ lib/readline/bind.c
          takes a length parameter; otherwise equivalent to rl_function_of_keyseq.
 
 lib/readline/readline.h
-       - rl_function_of_keyseq_len: add extern declration for new function
+       - rl_function_of_keyseq_len: add extern declaration for new function
 
 lib/readline/doc/rltech.texi
        - rl_function_of_keyseq_len: document new function interface
@@ -3873,3 +3873,54 @@ variables.c
          function) without enabling debugging mode and not having initialized
          the variable previously (using a simple semaphore), create the
          variables
+
+                                  6/25
+                                  ----
+configure.ac
+       - opt_bash_malloc: bash malloc no longer disabled for systems that
+         require eight-bit alignment; the bash malloc has had this for a
+         long time
+
+                                   7/4
+                                   ---
+bashline.c
+       - pre_process_line: if command-oriented history is enabled, and the
+         line being expanded is the second or later in a multi-line command,
+         and we know the command is being saved as the current history entry,
+         decrease history_length before calling history_expand so references
+         like !! refer to the previous history entry as usual
+
+lib/readline/histexpand.c
+       - history_quoting_state: new variable, can be set by calling
+         application before calling history_expand to note that the string
+         being expanded is part of a quoted string. Can be set to a single
+         quote, a double quote, or 0 (no quoting)
+       - history_expand: look at history_quoting_state and honor the
+         single-quote setting by not expanding any initial portion of the
+         line before the closing single quote. This allows history expansions
+         to be performed on a line containing a closing single quote if they
+         appear after the single quote
+
+lib/readline/history.h
+       - history_quoting_state: extern declaration
+
+bashhist.c
+       - bash_history_inhibit_expansion: if history_quoting_state indicates
+         that this string is single-quoted, skip over the single-quoted
+         portion and determine whether or not the portion after the
+         quoted string needs to be inhibited from history expansion
+
+parse.y
+       - shell_getc: set history_quoting_state based on the contents of the
+         current delimiter before calling pre_process_line
+
+                                   7/6
+                                   ---
+lib/readline/doc/hsuser.texi
+       - describe the default behavior of backslash and single and double
+         quotes
+
+lib/readline/doc/hstech.texi
+       - history_quoting_state: describe effect of setting this variable
+       - history_quotes_inihibit_expansion: expand the description to include
+         the default quoting behavior that setting this variable enables
index cde3410f1ab66a12b8f36430f9730ffd69d33038..61f7cbf1640514e9d1e271c6a783d9fb8b411e44 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1074,6 +1074,7 @@ tests/histexp2.sub        f
 tests/histexp3.sub     f
 tests/histexp4.sub     f
 tests/histexp5.sub     f
+tests/histexp6.sub     f
 tests/histexp.right    f
 tests/history.tests    f
 tests/history.right    f
index 1672f139fbd9f524a1ee81ef1efb70aed42afd6f..7912cce311871da3766979ffe60178a4d03ce06d 100644 (file)
@@ -213,7 +213,7 @@ bash_history_inhibit_expansion (string, i)
      char *string;
      int i;
 {
-  int t;
+  int t, si;
   char hx[2];
 
   hx[0] = history_expansion_char;
@@ -236,9 +236,20 @@ bash_history_inhibit_expansion (string, i)
     return (1);
 #endif
 
+  si = 0;
+  /* If we're supposed to be in single-quoted string, skip over the
+     single-quoted part and then look at what's left. */
+  if (history_quoting_state == '\'')
+    {
+      si = skip_to_delim (string, 0, "'", SD_NOJMP|SD_HISTEXP);
+      if (string[si] == 0 || si >= i)
+       return (1);
+      si++;
+    }
+
   /* Make sure the history expansion should not be skipped by quoting or
      command/process substitution. */
-  else if ((t = skip_to_histexp (string, 0, hx, SD_NOJMP|SD_HISTEXP)) > 0)
+  if ((t = skip_to_histexp (string, si, hx, SD_NOJMP|SD_HISTEXP)) > 0)
     {
       /* Skip instances of history expansion appearing on the line before
         this one. */
@@ -549,7 +560,15 @@ pre_process_line (line, print_changes, addit)
      add that line to the history if ADDIT is non-zero. */
   if (!history_expansion_inhibited && history_expansion && history_expansion_p (line))
     {
+      /* If we are expanding the second or later line of a multi-line
+        command, decrease history_length so references to history expansions
+        in these lines refer to the previous history entry and not the
+        current command. */
+      if (history_length > 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1)
+        history_length--;
       expanded = history_expand (line, &history_value);
+      if (history_length >= 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1)
+        history_length++;
 
       if (expanded)
        {
index 4ad952b606b52c8e22637d4770a2ca65f370245c..73c1ce1ada67082ea3c2552de6b57aa13071776b 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.ac for Bash 5.0, version 4.092.
+# From configure.ac for Bash 5.0, version 4.094.
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.69 for bash 5.0-alpha.
 #
@@ -2847,33 +2847,38 @@ opt_with_installed_readline=no
 #htmldir=
 
 case "${host_cpu}-${host_os}" in
+# mostly obsolete platforms
 alpha*-*)      opt_bash_malloc=no ;;   # alpha running osf/1 or linux
 *[Cc]ray*-*)   opt_bash_malloc=no ;;   # Crays
 *-osf1*)       opt_bash_malloc=no ;;   # other osf/1 machines
+*-dgux*)       opt_bash_malloc=no ;;   # DG/UX machines
 sparc-svr4*)   opt_bash_malloc=no ;;   # sparc SVR4, SVR4.2
-sparc-netbsd*) opt_bash_malloc=no ;;   # needs 8-byte alignment
-mips-irix6*)   opt_bash_malloc=no ;;   # needs 8-byte alignment
 m68k-sysv)     opt_bash_malloc=no ;;   # fixes file descriptor leak in closedir
+*-bsdi2.1|*-bsdi3.?)   opt_bash_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
+*-opennt*|*-interix*)  opt_bash_malloc=no ;;   # Interix, now owned by Microsoft
+*-beos*)       opt_bash_malloc=no ;;   # they say it's suitable
+# These need additional investigation
 sparc-linux*)  opt_bash_malloc=no ;;   # sparc running linux; requires ELF
-#*-freebsd*-gnu)       opt_bash_malloc=no ;;   # there's some undetermined problem here
-#*-freebsd*)   opt_bash_malloc=no ;;   # they claim it's better; I disagree
-*-openbsd*)    opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
-*-mirbsd*)     opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
 *-aix*)                opt_bash_malloc=no ;;   # AIX machines
+*-cygwin*)     opt_bash_malloc=no ;;   # Cygnus's CYGWIN environment
+# Mach-derived systems have a ton of extra malloc functions and lack sbrk(2)
 *-nextstep*)   opt_bash_malloc=no ;;   # NeXT machines running NeXTstep
 *-openstep*)   opt_bash_malloc=no ;;   # i386/Sparc/HP machines running Openstep
 *-macos*)      opt_bash_malloc=no ;;   # Apple MacOS X
 *-rhapsody*)   opt_bash_malloc=no ;;   # Apple Rhapsody (MacOS X)
 *-darwin*)     opt_bash_malloc=no ;;   # Apple Darwin (MacOS X)
-*-dgux*)       opt_bash_malloc=no ;;   # DG/UX machines
-*-qnx*)                opt_bash_malloc=no ;;   # QNX 4.2, QNX [67].x
 *-machten4)    opt_bash_malloc=no ;;   # MachTen 4.x
-*-bsdi2.1|*-bsdi3.?)   opt_bash_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
-*-beos*)       opt_bash_malloc=no ;;   # they say it's suitable
-*-cygwin*)     opt_bash_malloc=no ;;   # Cygnus's CYGWIN environment
-*-opennt*|*-interix*)  opt_bash_malloc=no ;;   # Interix, now owned by Microsoft
+# Niche or non-mainstream-shell-user systems
+*-qnx*)                opt_bash_malloc=no ;;   # QNX 4.2, QNX [67].x
 *-nsk*)                opt_bash_malloc=no ;;   # HP NonStop
 *-haiku*)      opt_bash_malloc=no ;;   # Haiku OS
+# Deprecated -- bash malloc is suitable
+#sparc-netbsd*)        opt_bash_malloc=no ;;   # needs 8-byte alignment
+#mips-irix6*)  opt_bash_malloc=no ;;   # needs 8-byte alignment
+#*-freebsd*-gnu)       opt_bash_malloc=no ;;   # there's some undetermined problem here
+#*-freebsd*)   opt_bash_malloc=no ;;   # they claim it's better; I disagree
+#*-openbsd*)   opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
+#*-mirbsd*)    opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
 esac
 
 # memory scrambling on free()
index d3287d980d25310af34801bf64129d96f0dd5e9c..005dddc3972041f2cdcb931bdb8dbe59a7bf6f26 100644 (file)
@@ -5,7 +5,7 @@ dnl report bugs to chet@po.cwru.edu
 dnl
 dnl Process this file with autoconf to produce a configure script.
 
-# Copyright (C) 1987-2016 Free Software Foundation, Inc.
+# Copyright (C) 1987-2018 Free Software Foundation, Inc.
 
 #
 #   This program is free software: you can redistribute it and/or modify
@@ -21,7 +21,7 @@ dnl Process this file with autoconf to produce a configure script.
 #   You should have received a copy of the GNU General Public License
 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-AC_REVISION([for Bash 5.0, version 4.092])dnl
+AC_REVISION([for Bash 5.0, version 4.094])dnl
 
 define(bashvers, 5.0)
 define(relstatus, alpha)
@@ -63,33 +63,38 @@ dnl some systems should be configured without the bash malloc by default
 dnl and some need a special compiler or loader
 dnl look in the NOTES file for more
 case "${host_cpu}-${host_os}" in
+# mostly obsolete platforms
 alpha*-*)      opt_bash_malloc=no ;;   # alpha running osf/1 or linux
 *[[Cc]]ray*-*) opt_bash_malloc=no ;;   # Crays
 *-osf1*)       opt_bash_malloc=no ;;   # other osf/1 machines
+*-dgux*)       opt_bash_malloc=no ;;   # DG/UX machines
 sparc-svr4*)   opt_bash_malloc=no ;;   # sparc SVR4, SVR4.2
-sparc-netbsd*) opt_bash_malloc=no ;;   # needs 8-byte alignment
-mips-irix6*)   opt_bash_malloc=no ;;   # needs 8-byte alignment
 m68k-sysv)     opt_bash_malloc=no ;;   # fixes file descriptor leak in closedir
+*-bsdi2.1|*-bsdi3.?)   opt_bash_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
+*-opennt*|*-interix*)  opt_bash_malloc=no ;;   # Interix, now owned by Microsoft
+*-beos*)       opt_bash_malloc=no ;;   # they say it's suitable
+# These need additional investigation
 sparc-linux*)  opt_bash_malloc=no ;;   # sparc running linux; requires ELF
-#*-freebsd*-gnu)       opt_bash_malloc=no ;;   # there's some undetermined problem here
-#*-freebsd*)   opt_bash_malloc=no ;;   # they claim it's better; I disagree
-*-openbsd*)    opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
-*-mirbsd*)     opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
 *-aix*)                opt_bash_malloc=no ;;   # AIX machines
+*-cygwin*)     opt_bash_malloc=no ;;   # Cygnus's CYGWIN environment
+# Mach-derived systems have a ton of extra malloc functions and lack sbrk(2)
 *-nextstep*)   opt_bash_malloc=no ;;   # NeXT machines running NeXTstep
 *-openstep*)   opt_bash_malloc=no ;;   # i386/Sparc/HP machines running Openstep
 *-macos*)      opt_bash_malloc=no ;;   # Apple MacOS X
 *-rhapsody*)   opt_bash_malloc=no ;;   # Apple Rhapsody (MacOS X)
 *-darwin*)     opt_bash_malloc=no ;;   # Apple Darwin (MacOS X)
-*-dgux*)       opt_bash_malloc=no ;;   # DG/UX machines
-*-qnx*)                opt_bash_malloc=no ;;   # QNX 4.2, QNX [67].x
 *-machten4)    opt_bash_malloc=no ;;   # MachTen 4.x
-*-bsdi2.1|*-bsdi3.?)   opt_bash_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
-*-beos*)       opt_bash_malloc=no ;;   # they say it's suitable
-*-cygwin*)     opt_bash_malloc=no ;;   # Cygnus's CYGWIN environment
-*-opennt*|*-interix*)  opt_bash_malloc=no ;;   # Interix, now owned by Microsoft
+# Niche or non-mainstream-shell-user systems
+*-qnx*)                opt_bash_malloc=no ;;   # QNX 4.2, QNX [67].x
 *-nsk*)                opt_bash_malloc=no ;;   # HP NonStop
 *-haiku*)      opt_bash_malloc=no ;;   # Haiku OS
+# Deprecated -- bash malloc is suitable
+#sparc-netbsd*)        opt_bash_malloc=no ;;   # needs 8-byte alignment
+#mips-irix6*)  opt_bash_malloc=no ;;   # needs 8-byte alignment
+#*-freebsd*-gnu)       opt_bash_malloc=no ;;   # there's some undetermined problem here
+#*-freebsd*)   opt_bash_malloc=no ;;   # they claim it's better; I disagree
+#*-openbsd*)   opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
+#*-mirbsd*)    opt_bash_malloc=no ;;   # they claim it needs eight-bit alignment
 esac
 
 # memory scrambling on free()
index 14cbe833d4ec2455f7f6ceb21a85fff238eeedf4..d89eec8e5fb38a302f8b15714d496abc5e1c1caa 100644 (file)
--- a/general.h
+++ b/general.h
@@ -110,6 +110,13 @@ extern char *strcpy __P((char *, const char *));
   ((TYPE_WIDTH (t) - TYPE_SIGNED (t)) * 302 / 1000 \
    + 1 + TYPE_SIGNED (t))
 
+/* Updated version adapted from gnulib/intprops.h, not used right now.
+   Changes the approximation of log10(2) from 302/1000 to 146/485. */
+#if 0
+#define INT_STRLEN_BOUND(t) \
+  (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - TYPE_SIGNED (t)) + TYPE_SIGNED(t))
+#endif
+
 /* Bound on buffer size needed to represent an integer type or expression T,
    including the terminating null.  */
 #define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
index d28bd48562567cad770e963a4ab825ea9268fe38..dbc21c14d9c870428828b4f9f9047e6ee93d690f 100644 (file)
@@ -403,7 +403,7 @@ to the ``normal'' terminating characters.
 Return an array of tokens parsed out of @var{string}, much as the
 shell might.  The tokens are split on the characters in the
 @var{history_word_delimiters} variable,
-and shell quoting conventions are obeyed.
+and shell quoting conventions are obeyed as described below.
 @end deftypefun
 
 @deftypefun {char *} history_arg_extract (int first, int last, const char *string)
@@ -476,8 +476,24 @@ carriage return, and @samp{=}.
 @end deftypevar
 
 @deftypevar int history_quotes_inhibit_expansion
-If non-zero, double-quoted words are not scanned for the history expansion
-character or the history comment character.  The default value is 0.
+If non-zero, the history expansion code implements shell-like quoting:
+single-quoted words are not scanned for the history expansion
+character or the history comment character, and double-quoted words may
+have history expansion performed, since single quotes are not special
+within double quotes.
+The default value is 0.
+@end deftypevar
+
+@deftypevar int history_quoting_state
+An application may set this variable to indicate that the current line
+being expanded is subject to existing quoting. If set to @samp{'}, the
+history expansion function will assume that the line is single-quoted and
+inhibit expansion until it reads an unquoted closing single quote; if set
+to @samp{"}, history expansion will assume the line is double quoted until
+it reads an unquoted closing double quote. If set to zero, the default,
+the history expansion function will assume the line is not quoted and
+treat quote characters within the line as described above.
+This is only effective if @var{history_quotes_inhibit_expansion} is set.
 @end deftypevar
 
 @deftypevar {rl_linebuf_func_t *} history_inhibit_expansion_function
index d21f65d0f143ebf21a17101bb2e0573a11bb3ad9..521ccc708ba812088ca9aa5345100b4594291a97 100644 (file)
@@ -262,8 +262,8 @@ fix errors in previous commands quickly.
 @ifset BashFeatures
 History expansion is performed immediately after a complete line
 is read, before the shell breaks it into words, and is performed
-on each line individually without taking quoting on previous lines into
-account.
+on each line individually.  Bash attempts to inform the history
+expansion functions about quoting still in effect from previous lines.
 @end ifset
 
 History expansion takes place in two parts.  The first is to determine
@@ -277,9 +277,19 @@ that Bash does, so that several words
 surrounded by quotes are considered one word.
 History expansions are introduced by the appearance of the
 history expansion character, which is @samp{!} by default.
+
+History expansion implements shell-like quoting conventions:
+a backslash can be used to remove the special handling for the next character;
+single quotes enclose verbatim sequences of characters, and can be used to
+inhibit history expansion;
+and characters enclosed within double quotes may be subject to history
+expansion, since backslash can escape the history expansion character,
+but single quotes may not, since they are not treated specially within
+double quotes.
+
 @ifset BashFeatures
-Only @samp{\} and @samp{'} may be used to escape the history expansion
-character, but the history expansion character is
+When using the shell, only @samp{\} and @samp{'} may be used to escape the
+history expansion character, but the history expansion character is
 also treated as quoted if it immediately precedes the closing double quote
 in a double-quoted string. 
 @end ifset
index 9fefcfae8a02940e1bfeec48c9c4661d50337078..79f419175082f835aabd60bfc41deaa92a214ff2 100644 (file)
@@ -1,10 +1,10 @@
 @ignore
-Copyright (C) 1988-2017 Free Software Foundation, Inc. 
+Copyright (C) 1988-2018 Free Software Foundation, Inc. 
 @end ignore
 
-@set EDITION 7.0
-@set VERSION 7.0
-@set UPDATED 28 December 2017
-@set UPDATED-MONTH December 2017
+@set EDITION 8.0
+@set VERSION 8.0
+@set UPDATED 6 July 2018
+@set UPDATED-MONTH July 2018
 
-@set LASTCHANGE Thu Dec 28 14:44:16 EST 2017
+@set LASTCHANGE Fri Jul  6 16:25:22 MDT 2018
index 34007796bdc239b08da860a0385fe1ae70907c97..92b996f9f288ed942bc1e14ca6339d905946684a 100644 (file)
@@ -1,6 +1,6 @@
 /* histexpand.c -- history expansion. */
 
-/* Copyright (C) 1989-2017 Free Software Foundation, Inc.
+/* Copyright (C) 1989-2018 Free Software Foundation, Inc.
 
    This file contains the GNU History Library (History), a set of
    routines for managing the text of previously typed lines.
@@ -107,6 +107,8 @@ char *history_word_delimiters = HISTORY_WORD_DELIMITERS;
    particular history expansion should be performed. */
 rl_linebuf_func_t *history_inhibit_expansion_function;
 
+int history_quoting_state = 0;
+
 /* **************************************************************** */
 /*                                                                 */
 /*                     History Expansion                           */
@@ -961,7 +963,22 @@ history_expand (char *hstring, char **output)
 
       /* `!' followed by one of the characters in history_no_expand_chars
         is NOT an expansion. */
-      for (i = dquote = squote = 0; string[i]; i++)
+      dquote = history_quoting_state == '"';
+      squote = history_quoting_state == '\'';
+
+      /* If the calling application tells us we are already reading a
+        single-quoted string, consume the rest of the string right now
+        and then go on. */
+      i = 0;
+      if (squote && history_quotes_inhibit_expansion)
+       {
+         hist_string_extract_single_quoted (string, &i, 0);
+         squote = 0;
+         if (string[i])
+           i++;
+       }
+
+      for ( ; string[i]; i++)
        {
 #if defined (HANDLE_MULTIBYTE)
          if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
@@ -1049,7 +1066,29 @@ history_expand (char *hstring, char **output)
     }
 
   /* Extract and perform the substitution. */
-  for (passc = dquote = squote = i = j = 0; i < l; i++)
+  dquote = history_quoting_state == '"';
+  squote = history_quoting_state == '\'';
+
+  /* If the calling application tells us we are already reading a
+     single-quoted string, consume the rest of the string right now
+     and then go on. */
+  i = j = 0;
+  if (squote && history_quotes_inhibit_expansion)
+    {
+      int c;
+
+      hist_string_extract_single_quoted (string, &i, 0);
+      squote = 0;
+      for (c = 0; c < i; c++)
+       ADD_CHAR (string[c]);      
+      if (string[i])
+       {
+         ADD_CHAR (string[i]);
+         i++;
+       }
+    }
+
+  for (passc = 0; i < l; i++)
     {
       int qc, tchar = string[i];
 
index fceb99cae52c0cbf3bb33a02077539b35ba6d1c1..cc3de29a64231d083d7b282e2eb247d692dbe521 100644 (file)
@@ -261,7 +261,9 @@ extern char *history_word_delimiters;
 extern char history_comment_char;
 extern char *history_no_expand_chars;
 extern char *history_search_delimiter_chars;
+
 extern int history_quotes_inhibit_expansion;
+extern int history_quoting_state;
 
 extern int history_write_timestamps;
 
diff --git a/parse.y b/parse.y
index 6457782babfa553859a094ba9bf5db9662373a60..8496e2d10a9bea58c25cb70eb7326353e8b077e6 100644 (file)
--- a/parse.y
+++ b/parse.y
@@ -2414,20 +2414,21 @@ shell_getc (remove_quoted_newline)
        {
          char *expansions;
 #  if defined (BANG_HISTORY)
-         int old_hist;
-
          /* If the current delimiter is a single quote, we should not be
             performing history expansion, even if we're on a different
             line from the original single quote. */
-         old_hist = history_expansion_inhibited;
          if (current_delimiter (dstack) == '\'')
-           history_expansion_inhibited = 1;
+           history_quoting_state = '\'';
+         else if (current_delimiter (dstack) == '"')
+           history_quoting_state = '"';
+         else
+           history_quoting_state = 0;
 #  endif
          /* Calling with a third argument of 1 allows remember_on_history to
             determine whether or not the line is saved to the history list */
          expansions = pre_process_line (shell_input_line, 1, 1);
 #  if defined (BANG_HISTORY)
-         history_expansion_inhibited = old_hist;
+         history_quoting_state = 0;
 #  endif
          if (expansions != shell_input_line)
            {
index 11ed733002884bfe90d5da1eef00e49a60754093..1eeb39fb551fa13a24bc58639ebd1f9865808b81 100644 (file)
@@ -223,3 +223,18 @@ echo +(/one|/two|/three)/Step1
 *(/tmp|/dev|/usr)/Step1
 echo *(/tmp|/dev|/usr)/Step1
 *(/tmp|/dev|/usr)/Step1
+one
+       echo echo one
+echo one
+echo one
+echo one
+    1  set -o histexpand
+    2  echo one
+    3  for f in a b c; do      echo echo one; done
+two
+       echo echo two
+echo two
+echo two
+echo two
+    1  echo two
+    2  for f in a b c; do      echo echo two; done
index 22c90a76b2bce9764c60bc19282444e72ec4a255..5ae925e132b0dc63391a0ab1e28703d27599f378 100644 (file)
@@ -141,3 +141,4 @@ ${THIS_SH} ./histexp2.sub
 ${THIS_SH} ./histexp3.sub
 ${THIS_SH} ./histexp4.sub
 ${THIS_SH} ./histexp5.sub
+${THIS_SH} ./histexp6.sub
diff --git a/tests/histexp6.sub b/tests/histexp6.sub
new file mode 100644 (file)
index 0000000..b95b460
--- /dev/null
@@ -0,0 +1,23 @@
+HISTFILE=$TMPDIR/bashhist-$$
+
+set -o history
+set -o histexpand
+
+echo one
+
+for f in a b c; do
+       echo !!
+done
+
+history
+history -c
+
+echo two
+for f in a b c; do
+       echo !-1
+done
+
+history
+
+set +o history
+rm -f $HISTFILE