|
|
|
|
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);
|