This patch documents two implemented and classical command line options "-v" and "-x". It is derived from Debian GNU/Linux. Index: doc/bash.1 --- doc/bash.1.orig 2006-10-03 14:54:26 +0200 +++ doc/bash.1 2008-03-28 15:28:44 +0100 @@ -116,6 +116,12 @@ This option allows the positional parameters to be set when invoking an interactive shell. .TP +.B \-v +Print shell input lines as they are read. +.TP +.B \-x +Print commands and their arguments as they are executed. +.TP .B \-D A list of all double-quoted strings preceded by \fB$\fP is printed on the standard output. ----------------------------------------------------------------------------- Port to HP-UX 11i and similar less smart platforms. Index: configure --- configure.orig 2006-09-26 17:06:01 +0200 +++ configure 2008-03-28 15:28:44 +0100 @@ -1517,6 +1517,7 @@ *-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 +*-hpux*) opt_bash_malloc=no ;; # HP HP-UX esac # memory scrambling on free() @@ -1662,7 +1663,7 @@ else MALLOC_LIB= - MALLOC_LIBRARY= + MALLOC_LIBRARY=dummy MALLOC_LDFLAGS= MALLOC_DEP= fi Index: syntax.h --- syntax.h.orig 2006-06-22 19:45:22 +0200 +++ syntax.h 2008-03-28 15:28:44 +0100 @@ -21,6 +21,8 @@ #ifndef _SYNTAX_H_ #define _SYNTAX_H_ +#include "config.h" + /* Defines for use by mksyntax.c */ #define slashify_in_quotes "\\`$\"\n" ----------------------------------------------------------------------------- This adds the OpenPKG packaging brand. Index: version.c --- version.c.orig 2005-05-16 17:58:34 +0200 +++ version.c 2008-03-28 15:28:44 +0100 @@ -77,7 +77,7 @@ show_shell_version (extended) int extended; { - printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE); + printf ("GNU bash, version %s (%s) [@l_openpkg_release@]\n", shell_version_string (), MACHTYPE); if (extended) printf (_("Copyright (C) 2005 Free Software Foundation, Inc.\n")); } ----------------------------------------------------------------------------- Ensure that Autoconf and friends are not run. Index: Makefile.in --- Makefile.in.orig 2006-08-17 20:03:35 +0200 +++ Makefile.in 2008-03-28 15:28:44 +0100 @@ -687,7 +687,6 @@ # comment out for distribution $(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 $(srcdir)/config.h.in - cd $(srcdir) && autoconf # for chet reconfig: force ----------------------------------------------------------------------------- Provide the y.tab.[ch] patches corresponding to what Bash 3.2 patches 001-039 apply to parse.y in order to not require that this package has dependencies to the GNU bison package. --- y.tab.c.orig 2008-04-30 19:34:48 +0200 +++ y.tab.c 2008-04-30 19:39:08 +0200 @@ -2359,6 +2359,7 @@ #define PST_CMDTOKEN 0x1000 /* command token OK - unused */ #define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */ #define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */ +#define PST_REGEXP 0x8000 /* parsing an ERE/BRE as a single word */ /* Initial size to allocate for tokens, and the amount to grow them by. */ @@ -3921,6 +3922,9 @@ return (character); } + if (parser_state & PST_REGEXP) + goto tokword; + /* Shell meta-characters. */ if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0)) { @@ -4028,6 +4032,7 @@ if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND)) return (character); +tokword: /* Okay, if we got this far, we have to read a word. Read one, and then check it against the known ones. */ result = read_token_word (character); @@ -4065,7 +4070,7 @@ /* itrace("parse_matched_pair: open = %c close = %c", open, close); */ count = 1; pass_next_character = backq_backslash = was_dollar = in_comment = 0; - check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0; + check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0; /* RFLAGS is the set of flags we want to pass to recursive calls. */ rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE); @@ -4532,8 +4537,11 @@ if (tok == WORD && test_binop (yylval.word->word)) op = yylval.word; #if defined (COND_REGEXP) - else if (tok == WORD && STREQ (yylval.word->word,"=~")) - op = yylval.word; + else if (tok == WORD && STREQ (yylval.word->word, "=~")) + { + op = yylval.word; + parser_state |= PST_REGEXP; + } #endif else if (tok == '<' || tok == '>') op = make_word_from_token (tok); /* ( */ @@ -4564,6 +4572,7 @@ /* rhs */ tok = read_token (READ); + parser_state &= ~PST_REGEXP; if (tok == WORD) { tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); @@ -4697,7 +4706,7 @@ if (pass_next_character) { pass_next_character = 0; - goto got_character; + goto got_escaped_character; } cd = current_delimiter (dstack); @@ -4749,9 +4758,34 @@ goto next_character; } +#ifdef COND_REGEXP + /* When parsing a regexp as a single word inside a conditional command, + we need to special-case characters special to both the shell and + regular expressions. Right now, that is only '(' and '|'. */ /*)*/ + if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/ + { + if (character == '|') + goto got_character; + + push_delimiter (dstack, character); + ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0); + pop_delimiter (dstack); + if (ttok == &matched_pair_error) + return -1; /* Bail immediately. */ + RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, + token_buffer_size, TOKEN_DEFAULT_GROW_SIZE); + token[token_index++] = character; + strcpy (token + token_index, ttok); + token_index += ttoklen; + FREE (ttok); + dollar_present = all_digit_token = 0; + goto next_character; + } +#endif /* COND_REGEXP */ + #ifdef EXTENDED_GLOB /* Parse a ksh-style extended pattern matching specification. */ - if (extended_glob && PATTERN_CHAR (character)) + if MBTEST(extended_glob && PATTERN_CHAR (character)) { peek_char = shell_getc (1); if MBTEST(peek_char == '(') /* ) */ @@ -4946,12 +4980,14 @@ got_character: - all_digit_token &= DIGIT (character); - dollar_present |= character == '$'; - if (character == CTLESC || character == CTLNUL) token[token_index++] = CTLESC; + got_escaped_character: + + all_digit_token &= DIGIT (character); + dollar_present |= character == '$'; + token[token_index++] = character; RESIZE_MALLOCED_BUFFER (token, token_index, 1, token_buffer_size, @@ -5660,7 +5696,7 @@ if (promptvars || posixly_correct) { last_exit_value = last_command_exit_value; - list = expand_prompt_string (result, Q_DOUBLE_QUOTES); + list = expand_prompt_string (result, Q_DOUBLE_QUOTES, 0); free (result); result = string_list (list); dispose_words (list);