commit bash-20090312 snapshot

This commit is contained in:
Chet Ramey
2011-12-08 20:06:34 -05:00
parent 602bb73910
commit 1231ac4798
44 changed files with 19164 additions and 488 deletions
+65
View File
@@ -7705,3 +7705,68 @@ parse.y
reported by Mike Frysinger <vapier@gentoo.org> (rest of fix
on 3/3)
3/10
----
{.,lib/readline}/doc/fdl.texi
- updated to FDL version 1.3
3/14
----
execute_cmd.c
- in execute_case_command, if ;& is used with no following pattern
list, make sure we don't reference a NULL pointer. Bug report and
fix from Clark Jian Wang <dearvoid@gmail.com>
parse.y
- make parser_state global, so other files can use it
- command_word_acceptable now returns non-zero if PST_REDIRLIST bit
set in parser_state, so we accept assignment statements and
perform alias expansion. Fix for bug reported by Vincent
Lefevre <vincent@vinc17.org> (2/24/2009)
parser.h
- add PST_REDIRLIST flag, notes that parser is currently parsing a
redirection list preceding a simple command
make_cmd.c
- make_simple_command now turns on PST_REDIRLIST in parser_state when
creating a new simple command
- make_simple_command turns off PST_REDIRLIST in parser_state if it
adds a non-redirection to the command it's building
- clean_simple_command turns off PST_REDIRLIST to make sure it's off
subst.c
- new flag for param_expand: PF_IGNUNBOUND, means to not exit if the
variable is unbound even if `set -u' is enabled
- change param_expand to not call err_unboundvar if the `pflags'
argument has the PF_IGNUNBOUND bit set
- parameter_brace_expand_word now takes an extra `pflags' argument to
pass down to param_expand; changed callers
- changed call to parameter_brace_expand_word in parameter_brace_expand
to add PF_IGNUNBOUND flag so ${@:-foo} doesn't cause the shell to
exit (but ${@} does) when there are no positional parameters. Fixes
Debian bug 519165 from Dan Jacobson <jidanni@jidanni.org>
parse.y
- add code to parse_comsub to allow here-documents within command
substitutions to be delimited by the closing right paren, with the
usual warning about here documents delimited by EOF on execution.
Fixes regression from bash-3.2 noted in Red Hat bugzilla 485664 by
Ralf Corsepius
3/15
----
subst.c
- string_list_dollar_at now checks for Q_PATQUOTE, which getpattern()
uses to denote Q_DOUBLE_QUOTES (?). Fixes a=abcd echo "${a#$*}"
when IFS= and args are `a b' as noted by Stephane Chazleas
<stephane_chazelas@yahoo.fr>
- param_expand now checks for Q_PATQUOTE and treats it identically
to Q_DOUBLE_QUOTES when expanding $*
- expand_word_unsplit now sets W_NOSPLIT in the flags of the word it
passes to expand_word_internal if $IFS is NULL
- expand_word_leave_quoted now sets expand_no_split_dollar_start and
the W_NOSPLIT bit in the word flags before calling
expand_word_internal if $IFS is NULL, just like expand_word_unsplit.
It is now virtually identical to expand_word_unsplit. Rest of fix for
problems reported by Stephane Chazleas <stephane_chazelas@yahoo.fr>
+78 -1
View File
@@ -7648,7 +7648,7 @@ builtins/read.def
parse.y
- break comment checking code into a common COMMENT_BEGIN define so
we can use it in multiple places in parse_comsub
- in parse_comsub, don't turn off the LEX_RESWDOK flag if we read a
- in parse_comsub, don't alter the LEX_RESWDOK flag if we read a
`#' and we're checking comments, even though `#' isn't a `shell break'
character. Fixes bug reported by Mike Frysinger <vapier@gentoo.org>
@@ -7693,3 +7693,80 @@ parse.y
- move LEX_PASSNEXT code to the top of parse_comsub, so the rest
of the function doesn't have to check for the flag at different
places
3/7
---
parse.y
- in parse_comsub, when looking for a reserved word (LEX_RESWDOK
non-zero), and in a case statement, we can see either an esac
or a pattern list. We handle an esac separately. We should
turn off LEX_RESWDOK if we see anything but a newline, since
we'll be reading a pattern list. Other part of fix for bug
reported by Mike Frysinger <vapier@gentoo.org> (rest of fix
on 3/3)
3/10
----
{.,lib/readline}/doc/fdl.texi
- updated to FDL version 1.3
3/14
----
execute_cmd.c
- in execute_case_command, if ;& is used with no following pattern
list, make sure we don't reference a NULL pointer. Bug report and
fix from Clark Jian Wang <dearvoid@gmail.com>
parse.y
- make parser_state global, so other files can use it
- command_word_acceptable now returns non-zero if PST_REDIRLIST bit
set in parser_state, so we accept assignment statements and
perform alias expansion. Fix for bug reported by Vincent
Lefevre <vincent@vinc17.org> (2/24/2009)
parser.h
- add PST_REDIRLIST flag, notes that parser is currently parsing a
redirection list preceding a simple command
make_cmd.c
- make_simple_command now turns on PST_REDIRLIST in parser_state when
creating a new simple command
- make_simple_command turns off PST_REDIRLIST in parser_state if it
adds a non-redirection to the command it's building
- clean_simple_command turns off PST_REDIRLIST to make sure it's off
subst.c
- new flag for param_expand: PF_IGNUNBOUND, means to not exit if the
variable is unbound even if `set -u' is enabled
- change param_expand to not call err_unboundvar if the `pflags'
argument has the PF_IGNUNBOUND bit set
- parameter_brace_expand_word now takes an extra `pflags' argument to
pass down to param_expand; changed callers
- changed call to parameter_brace_expand_word in parameter_brace_expand
to add PF_IGNUNBOUND flag so ${@:-foo} doesn't cause the shell to
exit (but ${@} does) when there are no positional parameters. Fixes
Debian bug 519165 from Dan Jacobson <jidanni@jidanni.org>
parse.y
- add code to parse_comsub to allow here-documents within command
substitutions to be delimited by the closing right paren, with the
usual warning about here documents delimited by EOF on execution.
Fixes regression from bash-3.2 noted in Red Hat bugzilla 485664 by
Ralf Corsepius
3/15
----
subst.c
- string_list_dollar_at now checks for Q_PATQUOTE, which getpattern()
uses to denote Q_DOUBLE_QUOTES (?). Fixes a=abcd echo "${a#$*}"
when IFS= and args are `a b' as noted by Stephane Chazleas
<stephane_chazelas@yahoo.fr>
- param_expand now checks for Q_PATQUOTE and treats it identically
to Q_DOUBLE_QUOTES when expanding $*
- expand_word_unsplit now sets W_NOSPLIT in the flags of the word it
passes to expand_word_internal
- expand_word_leave_quoted now sets expand_no_split_dollar_start and
the W_NOSPLIT bit in the word flags before calling
expand_word_internal, just like expand_word_unsplit. It is now
virtually identical to expand_word_unsplit. Rest of fix for
problems reported by Stephane Chazleas <stephane_chazelas@yahoo.fr>
+3
View File
@@ -777,6 +777,7 @@ tests/comsub-eof0.sub f
tests/comsub-eof1.sub f
tests/comsub-eof2.sub f
tests/comsub-eof3.sub f
tests/comsub-eof4.sub f
tests/comsub-eof.right f
tests/comsub-posix.tests f
tests/comsub-posix.right f
@@ -797,9 +798,11 @@ tests/dbg-support3.sub f
tests/dollar-at-star f
tests/dollar-at1.sub f
tests/dollar-at2.sub f
tests/dollar-at3.sub f
tests/dollar-star1.sub f
tests/dollar-star2.sub f
tests/dollar-star3.sub f
tests/dollar-star4.sub f
tests/dollar.right f
tests/dstack.tests f
tests/dstack.right f
+2
View File
@@ -771,11 +771,13 @@ tests/casemod.tests f
tests/casemod.right f
tests/comsub.tests f
tests/comsub.right f
tests/comsub1.sub f
tests/comsub-eof.tests f
tests/comsub-eof0.sub f
tests/comsub-eof1.sub f
tests/comsub-eof2.sub f
tests/comsub-eof3.sub f
tests/comsub-eof4.sub f
tests/comsub-eof.right f
tests/comsub-posix.tests f
tests/comsub-posix.right f
+242
View File
@@ -0,0 +1,242 @@
This file is alias.def, from which is created alias.c
It implements the builtins "alias" and "unalias" in Bash.
Copyright (C) 1987-2009 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
Bash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Bash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bash. If not, see <http://www.gnu.org/licenses/>.
$BUILTIN alias
$FUNCTION alias_builtin
$DEPENDS_ON ALIAS
$PRODUCES alias.c
$SHORT_DOC alias [-p] [name[=value] ... ]
Define or display aliases.
Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.
Otherwise, an alias is defined for each NAME whose VALUE is given.
A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.
Options:
-p Print all defined aliases in a reusable format
Exit Status:
alias returns true unless a NAME is supplied for which no alias has been
defined.
$END
#include <config.h>
#if defined (ALIAS)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
# include "../bashansi.h"
# include "../bashintl.h"
# include <stdio.h>
# include "../shell.h"
# include "../alias.h"
# include "common.h"
# include "bashgetopt.h"
/* Flags for print_alias */
#define AL_REUSABLE 0x01
static void print_alias __P((alias_t *, int));
extern int posixly_correct;
/* Hack the alias command in a Korn shell way. */
int
alias_builtin (list)
WORD_LIST *list;
{
int any_failed, offset, pflag, dflags;
alias_t **alias_list, *t;
char *name, *value;
itrace("alias_builtin");
dflags = posixly_correct ? 0 : AL_REUSABLE;
pflag = 0;
reset_internal_getopt ();
while ((offset = internal_getopt (list, "p")) != -1)
{
switch (offset)
{
case 'p':
pflag = 1;
dflags |= AL_REUSABLE;
break;
default:
builtin_usage ();
return (EX_USAGE);
}
}
list = loptend;
if (list == 0 || pflag)
{
if (aliases == 0)
return (EXECUTION_SUCCESS);
alias_list = all_aliases ();
if (alias_list == 0)
return (EXECUTION_SUCCESS);
for (offset = 0; alias_list[offset]; offset++)
print_alias (alias_list[offset], dflags);
free (alias_list); /* XXX - Do not free the strings. */
if (list == 0)
return (sh_chkwrite (EXECUTION_SUCCESS));
}
any_failed = 0;
while (list)
{
name = list->word->word;
for (offset = 0; name[offset] && name[offset] != '='; offset++)
;
if (offset && name[offset] == '=')
{
name[offset] = '\0';
value = name + offset + 1;
if (legal_alias_name (name, 0) == 0)
{
builtin_error (_("`%s': invalid alias name"), name);
any_failed++;
}
else
add_alias (name, value);
}
else
{
t = find_alias (name);
if (t)
print_alias (t, dflags);
else
{
sh_notfound (name);
any_failed++;
}
}
list = list->next;
}
return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
}
#endif /* ALIAS */
$BUILTIN unalias
$FUNCTION unalias_builtin
$DEPENDS_ON ALIAS
$SHORT_DOC unalias [-a] name [name ...]
Remove each NAME from the list of defined aliases.
Options:
-a remove all alias definitions.
Return success unless a NAME is not an existing alias.
$END
#if defined (ALIAS)
/* Remove aliases named in LIST from the aliases database. */
int
unalias_builtin (list)
register WORD_LIST *list;
{
register alias_t *alias;
int opt, aflag;
aflag = 0;
reset_internal_getopt ();
while ((opt = internal_getopt (list, "a")) != -1)
{
switch (opt)
{
case 'a':
aflag = 1;
break;
default:
builtin_usage ();
return (EX_USAGE);
}
}
list = loptend;
if (aflag)
{
delete_all_aliases ();
return (EXECUTION_SUCCESS);
}
if (list == 0)
{
builtin_usage ();
return (EX_USAGE);
}
aflag = 0;
while (list)
{
alias = find_alias (list->word->word);
if (alias)
remove_alias (alias->name);
else
{
sh_notfound (list->word->word);
aflag++;
}
list = list->next;
}
return (aflag ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
}
/* Output ALIAS in such a way as to allow it to be read back in. */
static void
print_alias (alias, flags)
alias_t *alias;
int flags;
{
char *value;
value = sh_single_quote (alias->value);
if (flags & AL_REUSABLE)
printf ("alias ");
printf ("%s=%s\n", alias->name, value);
free (value);
fflush (stdout);
}
#endif /* ALIAS */
+205
View File
@@ -0,0 +1,205 @@
*** ../bash-4.0-patched/parse.y 2009-03-08 21:24:47.000000000 -0400
--- parse.y 2009-03-14 20:24:51.000000000 -0400
***************
*** 260,263 ****
--- 260,266 ----
int current_token;
+ /* The current parser state. */
+ int parser_state;
+
/* Variables to manage the task of reading here documents, because we need to
defer the reading until after a complete command has been collected. */
***************
*** 284,290 ****
static int arith_for_lineno;
- /* The current parser state. */
- static int parser_state;
-
/* The last read token, or NULL. read_token () uses this for context
checking. */
--- 287,290 ----
***************
*** 1123,1127 ****
REDIRECT *r;
! tc = $1;
rd.dest = 1;
r = make_redirection (2, r_duplicating_output, rd);
--- 1123,1127 ----
REDIRECT *r;
! tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
rd.dest = 1;
r = make_redirection (2, r_duplicating_output, rd);
***************
*** 2397,2401 ****
#define command_token_position(token) \
! (((token) == ASSIGNMENT_WORD) || \
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
--- 2397,2401 ----
#define command_token_position(token) \
! (((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
***************
*** 2968,2972 ****
int retind, retsize, rflags;
! /* itrace("parse_matched_pair: open = %c close = %c flags = %d", open, close, flags); */
count = 1;
tflags = 0;
--- 2968,2972 ----
int retind, retsize, rflags;
! /*itrace("parse_matched_pair: open = %c close = %c flags = %d", open, close, flags); */
count = 1;
tflags = 0;
***************
*** 3263,3266 ****
--- 3263,3283 ----
prompt_again ();
+ /* XXX -- possibly allow here doc to be delimited by ending right
+ paren. */
+ if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
+ {
+ int tind;
+ /*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
+ tind = lex_firstind;
+ while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
+ tind++;
+ if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
+ {
+ tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
+ /*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
+ lex_firstind = -1;
+ }
+ }
+
/* Don't bother counting parens or doing anything else if in a comment */
if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC))
***************
*** 3271,3275 ****
--- 3288,3295 ----
if ((tflags & LEX_INCOMMENT) && ch == '\n')
+ {
+ /*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/
tflags &= ~LEX_INCOMMENT;
+ }
continue;
***************
*** 3365,3369 ****
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
ret[retind++] = peekc;
! /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch); */
tflags |= LEX_RESWDOK;
lex_rwlen = 0;
--- 3385,3389 ----
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
ret[retind++] = peekc;
! /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
tflags |= LEX_RESWDOK;
lex_rwlen = 0;
***************
*** 3373,3378 ****
{
shell_ungetc (peekc);
- tflags |= LEX_RESWDOK;
/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
lex_rwlen = 0;
continue;
--- 3393,3398 ----
{
shell_ungetc (peekc);
/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
+ tflags |= LEX_RESWDOK;
lex_rwlen = 0;
continue;
***************
*** 3404,3413 ****
{
tflags |= LEX_INCASE;
! /*itrace("parse_comsub:%d: found `case', lex_incase -> 1", line_number);*/
}
else if (STREQN (ret + retind - 4, "esac", 4))
{
tflags &= ~LEX_INCASE;
! /*itrace("parse_comsub:%d: found `esac', lex_incase -> 0", line_number);*/
}
tflags &= ~LEX_RESWDOK;
--- 3424,3433 ----
{
tflags |= LEX_INCASE;
! /*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/
}
else if (STREQN (ret + retind - 4, "esac", 4))
{
tflags &= ~LEX_INCASE;
! /*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/
}
tflags &= ~LEX_RESWDOK;
***************
*** 3432,3435 ****
--- 3452,3456 ----
}
+ /* Might be the start of a here-doc delimiter */
if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<')
{
***************
*** 3488,3492 ****
--- 3509,3516 ----
}
else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
+ {
count++;
+ /*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
+ }
/* Add this character. */
***************
*** 5232,5236 ****
if (interactive && EOF_Reached)
EOF_Reached = 0;
! last_command_exit_value = EX_USAGE;
return;
}
--- 5256,5260 ----
if (interactive && EOF_Reached)
EOF_Reached = 0;
! last_command_exit_value = EX_BADUSAGE;
return;
}
***************
*** 5247,5251 ****
print_offending_line ();
! last_command_exit_value = EX_USAGE;
return;
}
--- 5271,5275 ----
print_offending_line ();
! last_command_exit_value = EX_BADUSAGE;
return;
}
***************
*** 5278,5282 ****
}
! last_command_exit_value = EX_USAGE;
}
--- 5302,5306 ----
}
! last_command_exit_value = EX_BADUSAGE;
}
+1 -1
View File
@@ -94,7 +94,7 @@ GROFF = groff
HSUSER = $(RL_LIBDIR)/doc/hsuser.texi
RLUSER = $(RL_LIBDIR)/doc/rluser.texi
BASHREF_FILES = $(srcdir)/bashref.texi $(srcdir)/version.texi
BASHREF_FILES = $(srcdir)/bashref.texi $(srcdir)/fdl.texi $(srcdir)/version.texi
.SUFFIXES: .0 .1 .3 .ms .ps .txt .dvi .html .pdf
BIN
View File
Binary file not shown.
+81 -15
View File
@@ -1,6 +1,6 @@
<HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- Created on March, 5 2009 by texi2html 1.64 -->
<!-- Created on March, 10 2009 by texi2html 1.64 -->
<!--
Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
Karl Berry <karl@freefriends.org>
@@ -13512,12 +13512,12 @@ The SVR4.2 shell behaves differently when invoked as <CODE>jsh</CODE>
<P>
<center>
Version 1.2, November 2002
Version 1.3, 3 November 2008
</center>
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
<A HREF="http://fsf.org/">http://fsf.org/</A>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -13635,6 +13635,10 @@ the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
</P><P>
The "publisher" means any person or entity that distributes copies
of the Document to the public.
</P><P>
A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
@@ -13948,13 +13952,33 @@ title.
TERMINATION
<P>
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License. Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.
</P><P>
However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
</P><P>
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
</P><P>
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
</P><P>
<LI>
@@ -13975,7 +13999,49 @@ following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
</P><P>
<LI>
RELICENSING
<P>
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
"Massive Multiauthor Collaboration" (or "MMC") contained in the
site means any set of copyrightable works thus published on the MMC
site.
</P><P>
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
</P><P>
"Incorporate" means to publish or republish a Document, in whole or
in part, as part of another Document.
</P><P>
An MMC is "eligible for relicensing" if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.
</P><P>
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
</P><P>
</OL>
<P>
@@ -13991,7 +14057,7 @@ license notices just after the title page:
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre> Copyright (C) <VAR>year</VAR> <VAR>your name</VAR>.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
@@ -15802,7 +15868,7 @@ to permit their use in free software.
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H1>About this document</H1>
This document was generated by <I>Chet Ramey</I> on <I>March, 5 2009</I>
This document was generated by <I>Chet Ramey</I> on <I>March, 10 2009</I>
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
"><I>texi2html</I></A>
<P></P>
@@ -15964,7 +16030,7 @@ the following structure:
<BR>
<FONT SIZE="-1">
This document was generated
by <I>Chet Ramey</I> on <I>March, 5 2009</I>
by <I>Chet Ramey</I> on <I>March, 10 2009</I>
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
"><I>texi2html</I></A>
+71 -17
View File
@@ -8988,10 +8988,10 @@ File: bashref.info, Node: GNU Free Documentation License, Next: Indexes, Prev
Appendix C GNU Free Documentation License
*****************************************
Version 1.2, November 2002
Version 1.3, 3 November 2008
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
`http://fsf.org/'
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -9093,6 +9093,9 @@ Appendix C GNU Free Documentation License
Page" means the text near the most prominent appearance of the
work's title, preceding the beginning of the body of the text.
The "publisher" means any person or entity that distributes copies
of the Document to the public.
A section "Entitled XYZ" means a named subunit of the Document
whose title either is precisely XYZ or contains XYZ in parentheses
following text that translates XYZ in another language. (Here XYZ
@@ -9358,12 +9361,29 @@ Appendix C GNU Free Documentation License
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided for under this License. Any other
attempt to copy, modify, sublicense or distribute the Document is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void,
and will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly
and finally terminates your license, and (b) permanently, if the
copyright holder fails to notify you of the violation by some
reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from
that copyright holder, and you cure the violation prior to 30 days
after your receipt of the notice.
Termination of your rights under this section does not terminate
the licenses of parties who have received copies or rights from
you under this License. If your rights have been terminated and
not permanently reinstated, receipt of a copy of some or all of
the same material does not give you any rights to use it.
10. FUTURE REVISIONS OF THIS LICENSE
@@ -9381,7 +9401,41 @@ Appendix C GNU Free Documentation License
published (not as a draft) by the Free Software Foundation. If
the Document does not specify a version number of this License,
you may choose any version ever published (not as a draft) by the
Free Software Foundation.
Free Software Foundation. If the Document specifies that a proxy
can decide which future versions of this License can be used, that
proxy's public statement of acceptance of a version permanently
authorizes you to choose that version for the Document.
11. RELICENSING
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server.
A "Massive Multiauthor Collaboration" (or "MMC") contained in the
site means any set of copyrightable works thus published on the MMC
site.
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
"Incorporate" means to publish or republish a Document, in whole or
in part, as part of another Document.
An MMC is "eligible for relicensing" if it is licensed under this
License, and if all works that were first published under this
License somewhere other than this MMC, and subsequently
incorporated in whole or in part into the MMC, (1) had no cover
texts or invariant sections, and (2) were thus incorporated prior
to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the
site under CC-BY-SA on the same site at any time before August 1,
2009, provided the MMC is eligible for relicensing.
ADDENDUM: How to use this License for your documents
====================================================
@@ -9392,7 +9446,7 @@ notices just after the title page:
Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
@@ -10133,11 +10187,11 @@ Node: Optional Features339375
Node: Reporting Bugs348777
Node: Major Differences From The Bourne Shell349974
Node: GNU Free Documentation License366661
Node: Indexes389122
Node: Builtin Index389576
Node: Reserved Word Index396403
Node: Variable Index398851
Node: Function Index410657
Node: Concept Index417389
Node: Indexes391857
Node: Builtin Index392311
Node: Reserved Word Index399138
Node: Variable Index401586
Node: Function Index413392
Node: Concept Index420124

End Tag Table
+3 -3
View File
@@ -1,4 +1,4 @@
This is TeX, Version 3.141592 (Web2C 7.5.4) (format=tex 2008.12.11) 5 MAR 2009 07:54
This is TeX, Version 3.141592 (Web2C 7.5.4) (format=tex 2008.12.11) 10 MAR 2009 11:44
**/Users/chet/src/bash/src/doc/bashref.texi
(/Users/chet/src/bash/src/doc/bashref.texi (./texinfo.tex
Loading texinfo [version 2003-02-03.16]: Basics,
@@ -339,7 +339,7 @@ s/large_
[130] [131] [132] Appendix A [133] [134] Appendix B [135] [136] [137] [138]
[139] [140] [141] Appendix C [142] (./fdl.texi [143] [144] [145] [146] [147]
[148]) Appendix D [149] [150] (./bashref.bts [151]) (./bashref.rws)
[148] [149]) Appendix D [150] (./bashref.bts [151]) (./bashref.rws)
(./bashref.vrs [152] [153]) (./bashref.fns [154] [155]) (./bashref.cps [156])
Overfull \vbox (40.58205pt too high) has occurred while \output is active
\vbox(643.19986+0.0)x433.62
@@ -374,4 +374,4 @@ Here is how much of TeX's memory you used:
19 hyphenation exceptions out of 8191
15i,8n,11p,269b,474s stack positions out of 5000i,500n,6000p,200000b,5000s
Output written on bashref.dvi (164 pages, 639008 bytes).
Output written on bashref.dvi (164 pages, 642324 bytes).
+357 -296
View File
@@ -11,7 +11,7 @@
%DVIPSWebPage: (www.radicaleye.com)
%DVIPSCommandLine: dvips -D 600 -t letter -o bashref.ps bashref.dvi
%DVIPSParameters: dpi=600
%DVIPSSource: TeX output 2009.03.05:0754
%DVIPSSource: TeX output 2009.03.10:1144
%%BeginProcSet: tex.pro 0 0
%!
/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
@@ -14493,18 +14493,17 @@ b Ft(The)30 b(SVR4.2)h(shell)g(b)s(eha)m(v)m(es)f(di\013eren)m(tly)h
TeXDict begin 143 148 bop 150 -116 a Ft(App)s(endix)29
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
b(143)150 299 y Fo(App)t(endix)52 b(C)126 b(GNU)53 b(F)-13
b(ree)53 b(Do)t(cumen)l(tation)f(License)1396 502 y Ft(V)-8
b(ersion)31 b(1.2,)h(No)m(v)m(em)m(b)s(er)g(2002)390
b(ree)53 b(Do)t(cumen)l(tation)f(License)1359 502 y Ft(V)-8
b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390
635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fp(\015)e
Ft(2000,2001,2002)36 b(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8
b(oundation,)32 b(Inc.)390 745 y(51)f(F)-8 b(ranklin)31
b(St,)f(Fifth)h(Flo)s(or,)g(Boston,)h(MA)61 b(02110-1301,)35
b(USA)390 964 y(Ev)m(ery)m(one)c(is)g(p)s(ermitted)f(to)h(cop)m(y)g
(and)f(distribute)g(v)m(erbatim)h(copies)390 1074 y(of)g(this)f
(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f(is)f(not)h(allo)m
(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330 1340 y(The)37
b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g(a)g(man)m
(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
Ft(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31
b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745
y Fs(http://fsf.org/)390 964 y Ft(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f
(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390
1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f
(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330
1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g
(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
1450 y(useful)29 b(do)s(cumen)m(t)h Fq(free)36 b Ft(in)29
b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f
@@ -14584,454 +14583,519 @@ b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25
b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
655 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short)
669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short)
g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
b(ron)m(t-Co)m(v)m(er)330 765 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er)
b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er)
j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f
(Do)s(cumen)m(t)h(is)f(released)g(under)330 874 y(this)h(License.)40
(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40
b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26
b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m
(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 984 y(b)s(e)k(at)h(most)g(25)g(w)m
(ords.)330 1121 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g
(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m
(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g
(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8
b(,)38 b(represen)m(ted)330 1230 y(in)d(a)h(format)g(whose)g(sp)s
b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s
(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
(public,)h(that)f(is)g(suitable)g(for)330 1340 y(revising)c(the)g(do)s
(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s
(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
f(or)f(\(for)h(images)h(com-)330 1450 y(p)s(osed)23 b(of)h(pixels\))g
f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g
(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1559
(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587
y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
1669 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
(otherwise)330 1778 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
(arranged)g(to)330 1888 y(th)m(w)m(art)27 b(or)g(discourage)g
(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g
(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
b(ransparen)m(t.)39 b(An)27 b(image)330 1998 y(format)35
b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35
b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
(is)330 2107 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
(\\Opaque".)330 2244 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fl(asci)r(i)g
Ft(without)330 2354 y(markup,)41 b(T)-8 b(exinfo)40 b(input)f(format,)j
(LaT)1775 2373 y(E)1826 2354 y(X)d(input)g(format,)k
Ft(without)330 2395 y(markup,)41 b(T)-8 b(exinfo)40 b(input)f(format,)j
(LaT)1775 2414 y(E)1826 2395 y(X)d(input)g(format,)k
Fl(sgml)c Ft(or)g Fl(xml)g Ft(using)g(a)h(publicly)330
2463 y(a)m(v)-5 b(ailable)34 b Fl(dtd)p Ft(,)d(and)g
2504 y(a)m(v)-5 b(ailable)34 b Fl(dtd)p Ft(,)d(and)g
(standard-conforming)g(simple)h Fl(html)p Ft(,)f(P)m(ostScript)h(or)f
Fl(pdf)g Ft(designed)g(for)330 2573 y(h)m(uman)37 b(mo)s(di\014cation.)
Fl(pdf)g Ft(designed)g(for)330 2614 y(h)m(uman)37 b(mo)s(di\014cation.)
65 b(Examples)38 b(of)g(transparen)m(t)g(image)i(formats)e(include)g
Fl(png)p Ft(,)i Fl(x)n(cf)e Ft(and)330 2682 y Fl(jpg)p
Fl(png)p Ft(,)i Fl(x)n(cf)e Ft(and)330 2724 y Fl(jpg)p
Ft(.)63 b(Opaque)38 b(formats)g(include)g(proprietary)g(formats)g(that)
h(can)f(b)s(e)g(read)g(and)f(edited)i(only)330 2792 y(b)m(y)g
h(can)f(b)s(e)g(read)g(and)f(edited)i(only)330 2833 y(b)m(y)g
(proprietary)g(w)m(ord)g(pro)s(cessors,)j Fl(sgml)c Ft(or)i
Fl(xml)e Ft(for)i(whic)m(h)f(the)g Fl(dtd)g Ft(and/or)g(pro)s(cessing)
330 2902 y(to)s(ols)32 b(are)f(not)g(generally)h(a)m(v)-5
330 2943 y(to)s(ols)32 b(are)f(not)g(generally)h(a)m(v)-5
b(ailable,)34 b(and)c(the)h(mac)m(hine-generated)i Fl(html)p
Ft(,)d(P)m(ostScript)i(or)f Fl(pdf)330 3011 y Ft(pro)s(duced)e(b)m(y)h
Ft(,)d(P)m(ostScript)i(or)f Fl(pdf)330 3052 y Ft(pro)s(duced)e(b)m(y)h
(some)h(w)m(ord)f(pro)s(cessors)g(for)g(output)g(purp)s(oses)e(only)-8
b(.)330 3148 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m
b(.)330 3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m
(ted)f(b)s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f
(follo)m(wing)330 3258 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g
(follo)m(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g
(legibly)-8 b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h
(app)s(ear)f(in)h(the)330 3367 y(title)g(page.)40 b(F)-8
(app)s(ear)f(in)h(the)330 3422 y(title)g(page.)40 b(F)-8
b(or)28 b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h
(an)m(y)e(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
3477 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
3587 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
3724 y(A)f(section)h(\\En)m(titled)g(XYZ")f(means)f(a)h(named)g
(subunit)e(of)h(the)h(Do)s(cumen)m(t)h(whose)e(title)i(either)330
3833 y(is)d(precisely)g(XYZ)g(or)f(con)m(tains)i(XYZ)f(in)f(paren)m
(theses)i(follo)m(wing)g(text)g(that)f(translates)h(XYZ)e(in)330
3943 y(another)e(language.)40 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g
(sp)s(eci\014c)g(section)h(name)f(men)m(tioned)h(b)s(elo)m(w,)g(suc)m
(h)330 4052 y(as)i(\\Ac)m(kno)m(wledgemen)m(ts",)33 b(\\Dedications",)e
(\\Endorsemen)m(ts",)e(or)f(\\History".\))42 b(T)-8 b(o)29
b(\\Preserv)m(e)330 4162 y(the)34 b(Title")h(of)e(suc)m(h)h(a)g
(section)g(when)f(y)m(ou)h(mo)s(dify)e(the)i(Do)s(cumen)m(t)h(means)e
(that)h(it)g(remains)g(a)330 4271 y(section)e(\\En)m(titled)f(XYZ")g
(according)g(to)g(this)g(de\014nition.)330 4408 y(The)c(Do)s(cumen)m(t)
i(ma)m(y)f(include)f(W)-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)
g(the)g(notice)h(whic)m(h)e(states)i(that)330 4518 y(this)34
b(License)g(applies)g(to)h(the)f(Do)s(cumen)m(t.)52 b(These)33
b(W)-8 b(arran)m(t)m(y)36 b(Disclaimers)f(are)g(considered)e(to)330
4628 y(b)s(e)k(included)g(b)m(y)g(reference)h(in)g(this)f(License,)j
(but)d(only)h(as)g(regards)f(disclaiming)i(w)m(arran)m(ties:)330
4737 y(an)m(y)e(other)g(implication)i(that)e(these)g(W)-8
b(arran)m(t)m(y)39 b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g
(and)f(has)h(no)330 4847 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h
(this)f(License.)199 4984 y(2.)61 b(VERBA)-8 b(TIM)31
b(COPYING)330 5121 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e
(distribute)h(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g
(commercially)h(or)330 5230 y(noncommercially)-8 b(,)48
b(pro)m(vided)42 b(that)h(this)f(License,)47 b(the)42
b(cop)m(yrigh)m(t)i(notices,)j(and)42 b(the)h(license)330
5340 y(notice)37 b(sa)m(ying)g(this)e(License)i(applies)e(to)i(the)f
(Do)s(cumen)m(t)g(are)g(repro)s(duced)e(in)i(all)g(copies,)j(and)p
eop end
3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit)
m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330
3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g
(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h
(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m
(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f
(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40
b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f
(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m
(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f
(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491
y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s
(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330
4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g
(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W)
-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m
(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f
(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36
b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m
(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f
(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g
(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39
b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330
5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199
5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end
%%Page: 145 151
TeXDict begin 145 150 bop 150 -116 a Ft(App)s(endix)29
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
b(145)330 299 y(that)27 b(y)m(ou)g(add)f(no)h(other)f(conditions)h
(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f(License.)40
b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 408 y(tec)m(hnical)35
b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h(the)f(reading)g(or)g
(further)e(cop)m(ying)j(of)f(the)g(copies)330 518 y(y)m(ou)25
b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
b(145)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h
(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h
(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42
b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j
(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e
(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e
(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h
(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f
(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330
737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h
(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330
847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
(copies.)330 628 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
(the)f(conditions)330 737 y(in)e(section)i(3.)330 883
(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200
y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
(publicly)330 993 y(displa)m(y)31 b(copies.)199 1139
y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1285 y(If)25
(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443
y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25
b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
1395 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
1504 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1614 y(these)j(Co)m(v)m
b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m
(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
1724 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
(the)h(publisher)330 1833 y(of)k(these)h(copies.)53 b(The)34
(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34
b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 1943 y(equally)e
(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e
(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
2052 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
330 2162 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
2271 y(resp)s(ects.)330 2418 y(If)32 b(the)h(required)f(texts)i(for)e
2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e
(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2527 y(the)h(\014rst)f
(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f
(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
2637 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 2783
2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051
y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
2892 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
330 3002 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
(whic)m(h)330 3112 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
(ork)330 3221 y(proto)s(cols)40 b(a)f(complete)h(T)-8
(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8
b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
(added)f(material.)67 b(If)330 3331 y(y)m(ou)39 b(use)g(the)g(latter)h
(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h
(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3440 y(distribution)f(of)g
(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g
(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
3550 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
(time)330 3660 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
(of)f(that)330 3769 y(edition)31 b(to)g(the)g(public.)330
3915 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330
4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
4025 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
(vide)g(y)m(ou)330 4134 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
(the)f(Do)s(cumen)m(t.)199 4281 y(4.)61 b(MODIFICA)-8
b(TIONS)330 4427 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8
b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
e(the)h(conditions)330 4536 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
(V)-8 b(ersion)22 b(under)d(precisely)330 4646 y(this)29
(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29
b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
(licensing)330 4755 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
(ossesses)f(a)i(cop)m(y)g(of)330 4865 y(it.)41 b(In)30
(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30
b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
(di\014ed)e(V)-8 b(ersion:)357 5011 y(A.)60 b(Use)33
(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33
b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e
(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510
5121 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m
5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m
(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8
b(,)510 5230 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g
(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)
h(title)h(as)510 5340 y(a)e(previous)f(v)m(ersion)g(if)h(the)f
(original)i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s
(ermission.)p eop end
b(,)p eop end
%%Page: 146 152
TeXDict begin 146 151 bop 150 -116 a Ft(146)2527 b(Bash)31
b(Reference)g(Man)m(ual)360 299 y(B.)61 b(List)31 b(on)f(the)h(Title)g
(P)m(age,)i(as)d(authors,)h(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m
(tities)j(resp)s(onsible)c(for)510 408 y(authorship)c(of)h(the)h(mo)s
(di\014cations)f(in)g(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)28
b(together)g(with)d(at)i(least)h(\014v)m(e)510 518 y(of)c(the)g
(principal)g(authors)f(of)i(the)f(Do)s(cumen)m(t)g(\(all)h(of)g(its)f
(principal)g(authors,)h(if)f(it)g(has)g(few)m(er)510
628 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g(y)m(ou)g(from)
f(this)g(requiremen)m(t.)359 766 y(C.)60 b(State)32 b(on)e(the)h(Title)
h(page)f(the)g(name)g(of)g(the)g(publisher)e(of)i(the)g(Mo)s(di\014ed)f
(V)-8 b(ersion,)32 b(as)f(the)510 876 y(publisher.)355
1015 y(D.)61 b(Preserv)m(e)31 b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f
(of)g(the)f(Do)s(cumen)m(t.)363 1154 y(E.)60 b(Add)30
b(an)i(appropriate)f(cop)m(yrigh)m(t)i(notice)f(for)g(y)m(our)f(mo)s
(di\014cations)g(adjacen)m(t)i(to)f(the)g(other)510 1263
y(cop)m(yrigh)m(t)g(notices.)365 1402 y(F.)61 b(Include,)28
b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g(notices,)h(a)e(license)
h(notice)g(giving)g(the)f(public)510 1512 y(p)s(ermission)23
b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8 b(ersion)25 b(under)e(the)i
(terms)f(of)h(this)f(License,)j(in)d(the)g(form)510 1621
y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
1760 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
b(Reference)g(Man)m(ual)510 299 y(b)s(e)g(listed)h(in)f(the)g(History)h
(section)g(of)g(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32
b(ma)m(y)g(use)f(the)g(same)h(title)h(as)510 408 y(a)e(previous)f(v)m
(ersion)g(if)h(the)f(original)i(publisher)d(of)h(that)h(v)m(ersion)g
(giv)m(es)h(p)s(ermission.)360 545 y(B.)61 b(List)31
b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h(one)g(or)f(more)h(p)s
(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c(for)510
655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g(Mo)s
(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h(\014v)m
(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s(cumen)m
(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g(few)m
(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g(y)m
(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60
b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31
b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641
y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
(required)g(Co)m(v)m(er)510 1870 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2008
(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244
y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
392 2147 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
(item)510 2257 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
b(ersion)510 2366 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
(the)g(Do)s(cu-)510 2476 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
(cumen)m(t)510 2586 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
b(ersion)37 b(as)510 2695 y(stated)31 b(in)f(the)h(previous)f(sen)m
(tence.)378 2834 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m
(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
(t)h(for)g(public)e(access)j(to)510 2944 y(a)e(T)-8 b(ransparen)m(t)30
(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30
b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3053 y(the)g(Do)s(cumen)m
m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m
(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3163
b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395
y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
(published)510 3272 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
d(of)i(the)510 3382 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
(ermission.)354 3521 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
(Preserv)m(e)c(the)g(Title)510 3630 y(of)j(the)f(section,)j(and)d
(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d
(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
h(of)f(eac)m(h)i(of)f(the)510 3740 y(con)m(tributor)k(ac)m(kno)m
h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m
(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
3879 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
(in)f(their)g(text)i(and)510 3988 y(in)f(their)g(titles.)58
(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58
b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
4098 y(section)c(titles.)341 4237 y(M.)61 b(Delete)33
4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33
b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
4346 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
4485 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
(in)510 4595 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
b(Section.)354 4734 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
b(arran)m(t)m(y)32 b(Disclaimers.)330 4902 y(If)h(the)g(Mo)s(di\014ed)g
(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g
(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
(app)s(endices)g(that)h(qualify)330 5011 y(as)28 b(Secondary)g
(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g
(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5121 y(y)m(our)k(option)h
(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h
(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5
b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)330
5230 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 b(arian)m(t)36
b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8 b(ersion's)36
b(license)g(notice.)57 b(These)330 5340 y(titles)32 b(m)m(ust)e(b)s(e)g
(distinct)h(from)e(an)m(y)i(other)g(section)g(titles.)p
b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p
eop end
%%Page: 147 153
TeXDict begin 147 152 bop 150 -116 a Ft(App)s(endix)29
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
b(147)330 299 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)i(En)m
(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
(nothing)g(but)330 408 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
b(147)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5
b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
b(ersion's)36 b(license)g(notice.)57 b(These)330 408
y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
b(parties|for)g(example,)g(statemen)m(ts)i(of)330 518
b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770
y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
628 y(de\014nition)i(of)h(a)f(standard.)330 757 y(Y)-8
880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8
b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 867 y(to)g(25)g(w)m(ords)e
b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e
(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
(di\014ed)330 976 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1086
(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351
y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
g(already)330 1196 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
(y)g(arrangemen)m(t)330 1305 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
(not)f(add)g(another;)j(but)330 1415 y(y)m(ou)c(ma)m(y)h(replace)g(the)
(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the)
f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
(publisher)f(that)330 1524 y(added)e(the)g(old)h(one.)330
1654 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330
1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
(ermission)330 1763 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
(Mo)s(di\014ed)330 1873 y(V)-8 b(ersion.)199 2002 y(5.)61
b(COMBINING)31 b(DOCUMENTS)330 2132 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61
b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
(released)g(under)f(this)g(License,)330 2242 y(under)f(the)h(terms)g
(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g
(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2351
(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655
y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
(cumen)m(ts,)330 2461 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
g(w)m(ork)f(in)h(its)g(license)330 2570 y(notice,)32
g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32
b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
b(arran)m(t)m(y)32 b(Disclaimers.)330 2700 y(The)e(com)m(bined)g(w)m
b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m
(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
i(and)d(m)m(ultiple)i(iden)m(tical)330 2809 y(In)m(v)-5
i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5
b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
(v)-5 b(arian)m(t)330 2919 y(Sections)27 b(with)g(the)g(same)g(name)g
(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g
(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
(eac)m(h)h(suc)m(h)f(section)330 3029 y(unique)33 b(b)m(y)h(adding)f
(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f
(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
(the)g(original)h(author)f(or)330 3138 y(publisher)23
(the)g(original)h(author)f(or)330 3455 y(publisher)23
b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
3248 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
(com)m(bined)330 3357 y(w)m(ork.)330 3487 y(In)41 b(the)g(com)m
(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m
(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
3597 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
3706 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
b(Y)-8 b(ou)330 3816 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
(titled)f(\\Endorsemen)m(ts.")199 3945 y(6.)61 b(COLLECTIONS)28
b(OF)i(DOCUMENTS)330 4075 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28
b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
(do)s(cumen)m(ts)f(released)330 4184 y(under)41 b(this)h(License,)k
(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k
(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
(the)h(v)-5 b(arious)330 4294 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
b(pro)m(vided)42 b(that)i(y)m(ou)330 4403 y(follo)m(w)38
b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38
b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
4513 y(other)31 b(resp)s(ects.)330 4643 y(Y)-8 b(ou)32
4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
(collection,)i(and)d(distribute)g(it)h(individu-)330
4752 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
4862 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
4971 y(that)d(do)s(cumen)m(t.)199 5101 y(7.)61 b(A)m(GGREGA)-8
b(TION)32 b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 5230 y(A)d(compilation)i
(of)e(the)g(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30
b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330
5340 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m
(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called)p
eop end
5340 y(that)d(do)s(cumen)m(t.)p eop end
%%Page: 148 154
TeXDict begin 148 153 bop 150 -116 a Ft(148)2527 b(Bash)31
b(Reference)g(Man)m(ual)330 299 y(an)f(\\aggregate")k(if)c(the)g(cop)m
(yrigh)m(t)i(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e
(to)i(limit)g(the)330 408 y(legal)d(righ)m(ts)f(of)g(the)g
(compilation's)h(users)e(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m
(orks)g(p)s(ermit.)39 b(When)330 518 y(the)g(Do)s(cumen)m(t)g(is)f
(included)g(in)g(an)g(aggregate,)44 b(this)38 b(License)h(do)s(es)f
(not)h(apply)f(to)h(the)g(other)330 628 y(w)m(orks)30
b(in)g(the)h(aggregate)i(whic)m(h)d(are)h(not)g(themselv)m(es)g(deriv)
-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h(Do)s(cumen)m(t.)330
762 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8 b(ext)23 b(requiremen)m(t)g(of)g
(section)h(3)f(is)g(applicable)h(to)f(these)h(copies)f(of)g(the)g(Do)s
(cumen)m(t,)330 872 y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f
(than)g(one)h(half)f(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s
(cumen)m(t's)g(Co)m(v)m(er)330 981 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f
(placed)h(on)g(co)m(v)m(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m
(t)g(within)f(the)h(aggregate,)j(or)d(the)330 1091 y(electronic)37
b(equiv)-5 b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m
(t)h(is)f(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
1200 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1335 y(8.)61
b(TRANSLA)-8 b(TION)330 1469 y(T)g(ranslation)41 b(is)f(considered)f(a)
b(Reference)g(Man)m(ual)199 299 y(7.)61 b(A)m(GGREGA)-8
b(TION)32 b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 441 y(A)d(compilation)i
(of)e(the)g(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30
b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330
551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m
(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called)
330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i(resulting)e
(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g(the)330
770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m
(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g
(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g
(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h
(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h
(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241
y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5
b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61
b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a)
i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
(translations)330 1579 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
b(arian)m(t)45 b(Sections)g(with)330 1689 y(translations)h(requires)f
b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f
(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
(holders,)i(but)c(y)m(ou)g(ma)m(y)330 1798 y(include)24
(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24
b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
1908 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
(License,)i(and)d(all)j(the)330 2017 y(license)42 b(notices)g(in)f(the)
(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the)
h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2127
b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513
y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
2237 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
(translation)i(and)330 2346 y(the)f(original)i(v)m(ersion)e(of)h(this)f
(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f
(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
(ersion)g(will)330 2456 y(prev)-5 b(ail.)330 2590 y(If)28
(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28
b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
2700 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
2809 y(c)m(hanging)j(the)g(actual)h(title.)199 2944 y(9.)61
b(TERMINA)-8 b(TION)330 3078 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61
b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3188 y(pro)m(vided)41
b(for)h(under)e(this)i(License.)75 b(An)m(y)42 b(other)g(attempt)h(to)g
(cop)m(y)-8 b(,)46 b(mo)s(dify)-8 b(,)44 b(sublicense)e(or)330
3298 y(distribute)36 b(the)h(Do)s(cumen)m(t)g(is)g(v)m(oid,)i(and)d
(will)h(automatically)i(terminate)f(y)m(our)e(righ)m(ts)h(under)330
3407 y(this)28 b(License.)40 b(Ho)m(w)m(ev)m(er,)31 b(parties)d(who)f
(ha)m(v)m(e)i(receiv)m(ed)g(copies,)h(or)d(righ)m(ts,)i(from)f(y)m(ou)g
(under)e(this)330 3517 y(License)37 b(will)g(not)g(ha)m(v)m(e)h(their)f
(licenses)g(terminated)h(so)f(long)g(as)g(suc)m(h)f(parties)h(remain)g
(in)f(full)330 3626 y(compliance.)154 3761 y(10.)61 b(FUTURE)30
b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 3895 y(The)41 b(F)-8
b(ree)43 b(Soft)m(w)m(are)f(F)-8 b(oundation)43 b(ma)m(y)f(publish)e
(new,)k(revised)d(v)m(ersions)h(of)g(the)g(GNU)g(F)-8
b(ree)330 4005 y(Do)s(cumen)m(tation)34 b(License)e(from)g(time)h(to)g
(time.)46 b(Suc)m(h)31 b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h
(in)g(spirit)330 4115 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)
m(y)h(di\013er)f(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i
(concerns.)330 4224 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p
Ft(.)330 4359 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m
(en)g(a)g(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39
b(If)29 b(the)g(Do)s(cumen)m(t)330 4468 y(sp)s(eci\014es)45
b(that)h(a)g(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g
(License)h(\\or)g(an)m(y)g(later)g(v)m(ersion")330 4578
y(applies)33 b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f
(follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
4687 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
(b)m(y)330 4797 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 4907
y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
h(F)-8 b(ree)330 5016 y(Soft)m(w)m(are)31 b(F)-8 b(oundation.)p
eop end
(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38
b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g
(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330
3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically)
i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330
3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i
(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h
(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h
(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g
(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h
(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8
b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34
b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h
(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288
y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d
(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h
(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h
(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g
(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m
(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f
(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330
4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g
(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h
(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28
b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h
(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38
b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g
(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e)
330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g
(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f
(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f
(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end
%%Page: 149 155
TeXDict begin 149 154 bop 150 -116 a Ft(App)s(endix)29
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
b(149)150 299 y Fr(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f
(for)g(y)l(our)g(do)t(cumen)l(ts)275 543 y Ft(T)-8 b(o)27
b(use)g(this)g(License)h(in)f(a)h(do)s(cumen)m(t)f(y)m(ou)h(ha)m(v)m(e)
g(written,)g(include)f(a)h(cop)m(y)g(of)f(the)h(License)g(in)f(the)150
653 y(do)s(cumen)m(t)j(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)m
(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
765 y Fe(Copyright)42 b(\(C\))79 b Fd(year)88 b(your)40
b(name)p Fe(.)468 852 y(Permission)i(is)e(granted)g(to)g(copy,)h
(distribute)g(and/or)g(modify)f(this)g(document)468 939
y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
(License,)f(Version)g(1.2)468 1026 y(or)f(any)g(later)g(version)h
b(149)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)
330 433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8
b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g
(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34
b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31
b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330
653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f
(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330
762 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p Ft(.)330
897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g
(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29
b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g
(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h
(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33
b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i
(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445
y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46
b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f
(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f
(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen)
m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m
(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g
(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330
2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or)
e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330
2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m
(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h
(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g
(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i
(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33
b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s
(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330
2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m
(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330
2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m
(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330
2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a)
g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330
2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29
b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions)
f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g
(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e
(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h
(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330
3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h
(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330
3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h
(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330
3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f
(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts)
330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j
(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s
(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h
(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site)
g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g
(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is)
330 4005 y(eligible)h(for)e(relicensing.)p eop end
%%Page: 150 156
TeXDict begin 150 155 bop 150 -116 a Ft(150)2527 b(Bash)31
b(Reference)g(Man)m(ual)150 299 y Fr(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g
(this)h(License)f(for)g(y)l(our)g(do)t(cumen)l(ts)275
543 y Ft(T)-8 b(o)27 b(use)g(this)g(License)h(in)f(a)h(do)s(cumen)m(t)f
(y)m(ou)h(ha)m(v)m(e)g(written,)g(include)f(a)h(cop)m(y)g(of)f(the)h
(License)g(in)f(the)150 653 y(do)s(cumen)m(t)j(and)g(put)g(the)g(follo)
m(wing)i(cop)m(yrigh)m(t)g(and)e(license)h(notices)g(just)f(after)h
(the)g(title)h(page:)468 765 y Fe(Copyright)42 b(\(C\))79
b Fd(year)88 b(your)40 b(name)p Fe(.)468 852 y(Permission)i(is)e
(granted)g(to)g(copy,)h(distribute)g(and/or)g(modify)f(this)g(document)
468 939 y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
(License,)f(Version)g(1.3)468 1026 y(or)f(any)g(later)g(version)h
(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
1113 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
(and)f(no)f(Back-Cover)468 1200 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f
@@ -15056,9 +15120,6 @@ y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g
b(as)g(the)g(GNU)150 2392 y(General)31 b(Public)f(License,)i(to)f(p)s
(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p
eop end
%%Page: 150 156
TeXDict begin 150 155 bop 150 -116 a Ft(150)2527 b(Bash)31
b(Reference)g(Man)m(ual)p eop end
%%Page: 151 157
TeXDict begin 151 156 bop 150 -116 a Ft(App)s(endix)29
b(D:)i(Indexes)2623 b(151)150 299 y Fo(App)t(endix)52
+1 -1
View File
@@ -864,7 +864,7 @@ operator terminates a pattern list.
A list of patterns and an associated command-list is known
as a @var{clause}.
Each clause must be terminated with @samp{;;}, @samp{,&}, or @samp{;;&}.
Each clause must be terminated with @samp{;;}, @samp{;&}, or @samp{;;&}.
The @var{word} undergoes tilde expansion, parameter expansion, command
substitution, arithmetic expansion, and quote removal before matching is
attempted. Each @var{pattern} undergoes tilde expansion, parameter
+7860
View File
File diff suppressed because it is too large Load Diff
+67 -12
View File
@@ -1,12 +1,12 @@
@c The GNU Free Documentation License.
@center Version 1.2, November 2002
@center Version 1.3, 3 November 2008
@c This file is intended to be included within another document,
@c hence no sectioning command or @node.
@display
Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
@uref{http://fsf.org/}
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -111,6 +111,9 @@ formats which do not have any title page as such, ``Title Page'' means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
The ``publisher'' means any person or entity that distributes copies
of the Document to the public.
A section ``Entitled XYZ'' means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
@@ -379,13 +382,30 @@ title.
@item
TERMINATION
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License. Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
@item
FUTURE REVISIONS OF THIS LICENSE
@@ -403,7 +423,42 @@ following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
@item
RELICENSING
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
site means any set of copyrightable works thus published on the MMC
site.
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
``Incorporate'' means to publish or republish a Document, in whole or
in part, as part of another Document.
An MMC is ``eligible for relicensing'' if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
@end enumerate
@page
@@ -417,7 +472,7 @@ license notices just after the title page:
@group
Copyright (C) @var{year} @var{your name}.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
+92 -38
View File
@@ -1,13 +1,13 @@
GNU Free Documentation License
Version 1.2, November 2002
GNU Free Documentation License
Version 1.3, 3 November 2008
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
<http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
@@ -50,11 +50,11 @@ modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject. (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.) The relationship could be a matter of historical
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (Thus, if the Document is in
part a textbook of mathematics, a Secondary Section may not explain
any mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
@@ -103,6 +103,9 @@ formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
The "publisher" means any person or entity that distributes copies of
the Document to the public.
A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
@@ -118,14 +121,13 @@ License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
to the Document are reproduced in all copies, and that you add no
other conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
@@ -169,8 +171,9 @@ Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
Document well before redistributing any large number of copies, to
give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS
@@ -285,16 +288,18 @@ Entitled "Endorsements".
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the rules
of this License for verbatim copying of each of the documents in all
other respects.
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert a
copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that
document.
7. AGGREGATION WITH INDEPENDENT WORKS
@@ -304,7 +309,7 @@ and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included an aggregate, this License does not
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
@@ -340,21 +345,38 @@ title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License. Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
The Free Software Foundation may publish new, revised versions of the
GNU Free Documentation License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in
detail to address new problems or concerns. See
http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number.
@@ -364,7 +386,39 @@ following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
11. RELICENSING
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
"Massive Multiauthor Collaboration" (or "MMC") contained in the site
means any set of copyrightable works thus published on the MMC site.
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
"Incorporate" means to publish or republish a Document, in whole or in
part, as part of another Document.
An MMC is "eligible for relicensing" if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole or
in part into the MMC, (1) had no cover texts or invariant sections, and
(2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
ADDENDUM: How to use this License for your documents
@@ -375,7 +429,7 @@ license notices just after the title page:
Copyright (c) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU
+6 -4
View File
@@ -7,11 +7,13 @@
# Chet Ramey
# chet@po.cwru.edu
#
trap 'rm -f /tmp/cb$$.?' 0 1 2 3 6 15
trap 'rm -f $TMPFILE' 0 1 2 3 6 15
TMPFILE=$(mktemp -t cb.XXXXXX) || exit 1
T=$'\t'
cat << \EOF >/tmp/cb$$.1
cat << \EOF >$TMPFILE
mkalias ()
{
case $2 in
@@ -31,9 +33,9 @@ EOF
# since they whole thing is going to be surrounded by single quotes when
# passed to mkalias
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>$TMPFILE
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
$BASH $TMPFILE | sed -e 's/\$cwd/\$PWD/g' \
-e 's/\$term/\$TERM/g' \
-e 's/\$home/\$HOME/g' \
-e 's/\$user/\$USER/g' \
+5 -5
View File
@@ -7,11 +7,11 @@
# Chet Ramey
# chet@po.cwru.edu
#
trap 'rm -f /tmp/cb$$.?' 0 1 2 3 6 15
trap 'rm -f $TMPFILE' 0 1 2 3 6 15
TMPFILE=$(mktemp -t cb.XXXXXX) || exit 1
T=' '
cat << \EOF >/tmp/cb$$.1
cat << \EOF >$TMPFILE
mkalias ()
{
case $2 in
@@ -31,9 +31,9 @@ EOF
# since they whole thing is going to be surrounded by single quotes when
# passed to mkalias
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>$TMPFILE
sh /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
sh $TMPFILE | sed -e 's/\$cwd/\$PWD/g' \
-e 's/\$term/\$TERM/g' \
-e 's/\$home/\$HOME/g' \
-e 's/\$user/\$USER/g' \
+22 -13
View File
@@ -15,25 +15,34 @@
# Chet Ramey
# chet@po.cwru.edu
#
trap 'rm -f /tmp/cb$$.? cshout cshin' 0 1 2 3 6 15
trap 'rm -f $TMPFILE1 $TMPFILEa $TMPFILEe $TMPFILEv $TMPFILEco $TMPFILEci' 0 1 2 3 6 15
{ TMPFILE1=$(mktemp -t cb.1.XXXXXX) &&
TMPFILEa=$(mktemp -t cb.a.XXXXXX) &&
TMPFILEe=$(mktemp -t cb.e.XXXXXX) &&
TMPFILEv=$(mktemp -t cb.v.XXXXXX) &&
TMPFILEco=$(mktemp -t cshout.XXXXXX) &&
TMPFILEci=$(mktemp -t cshin.XXXXXX)
} || exit 1
T=$'\t'
SOURCE="${1:+source $1}"
cat << EOF >cshin
cat << EOF >$TMPFILEci
$SOURCE
alias >! /tmp/cb$$.a
setenv >! /tmp/cb$$.e
set >! /tmp/cb$$.v
alias >! $TMPFILEa
setenv >! $TMPFILEe
set >! $TMPFILEv
EOF
# give csh a minimal environment, similar to what login would provide
/usr/bin/env - USER=$USER HOME=$HOME PATH=/usr/bin:/bin:/usr/ucb:. TERM=$TERM SHELL=$SHELL /bin/csh -i < ./cshin > cshout 2>&1
/usr/bin/env - USER=$USER HOME=$HOME PATH=/usr/bin:/bin:/usr/ucb:. TERM=$TERM SHELL=$SHELL /bin/csh -i < $TMPFILEci > $TMPFILEco 2>&1
# First convert aliases
cat << \EOF >/tmp/cb$$.1
cat << \EOF >$TMPFILE1
mkalias ()
{
case $2 in
@@ -49,12 +58,12 @@ mkalias ()
}
EOF
sed "s/^\([a-zA-Z0-9_]*\)$T\(.*\)$/mkalias \1 '\2'/" < /tmp/cb$$.a >>/tmp/cb$$.1
sed "s/^\([a-zA-Z0-9_]*\)$T\(.*\)$/mkalias \1 '\2'/" < $TMPFILEa >>$TMPFILE1
echo '# csh aliases'
echo
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
$BASH $TMPFILE1 | sed -e 's/\$cwd/\$PWD/g' \
-e 's/\$term/\$TERM/g' \
-e 's/\$home/\$HOME/g' \
-e 's/\$user/\$USER/g' \
@@ -70,7 +79,7 @@ sed -e '/^SHLVL/d' \
-e '/^PWD/d' \
-e "s/'/'"\\\\"''"/g \
-e "s/^\([A-Za-z0-9_]*=\)/export \1'/" \
-e "s/$/'/" < /tmp/cb$$.e
-e "s/$/'/" < $TMPFILEe
# Finally, convert local variables
echo
@@ -82,7 +91,7 @@ sed -e 's/'"$T"'/=/' \
-e '/^[A-Za-z0-9_]*=[^(]/{
s/=/='"'/"'
s/$/'"'/"'
}' < /tmp/cb$$.v |
}' < $TMPFILEv |
sed -e '/^argv=/d' -e '/^cwd=/d' -e '/^filec=/d' -e '/^status=/d' \
-e '/^verbose=/d' \
-e '/^term=/d' \
@@ -110,7 +119,7 @@ echo
echo '# special csh variables converted to bash equivalents'
echo
sed -e 's/'"$T"'/=/' < /tmp/cb$$.v |
sed -e 's/'"$T"'/=/' < $TMPFILEv |
grep "^cdpath=" |
sed 's/(//
s/ /:/g
@@ -118,7 +127,7 @@ sed 's/(//
s/cdpath=/CDPATH=/'
sed -e 's/'"$T"'/=/' < /tmp/cb$$.v |
sed -e 's/'"$T"'/=/' < $TMPFILEv |
grep "^mail=" |
sed 's/(//
s/ /:/g
+1 -1
View File
@@ -2930,7 +2930,7 @@ execute_case_command (case_command)
retval = execute_command (clauses->action);
}
while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
if ((clauses->flags & CASEPAT_TESTNEXT) == 0)
if (clauses == 0 || (clauses->flags & CASEPAT_TESTNEXT) == 0)
EXIT_CASE ();
else
break;
+1 -2
View File
@@ -2930,7 +2930,7 @@ execute_case_command (case_command)
retval = execute_command (clauses->action);
}
while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
if ((clauses->flags & CASEPAT_TESTNEXT) == 0)
if (clauses && (clauses->flags & CASEPAT_TESTNEXT) == 0)
EXIT_CASE ();
else
break;
@@ -4083,7 +4083,6 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
if (variable_context == 0 || this_shell_function == 0)
{
make_funcname_visible (0);
itrace("execute_function: calling unlink_fifo_list");
unlink_fifo_list ();
}
+13 -4
View File
@@ -34,6 +34,7 @@
#include "bashintl.h"
#include "parser.h"
#include "syntax.h"
#include "command.h"
#include "general.h"
@@ -53,7 +54,7 @@
#include "shmbutil.h"
extern int line_number, current_command_line_count;
extern int line_number, current_command_line_count, parser_state;
extern int last_command_exit_value;
/* Object caching */
@@ -528,11 +529,17 @@ make_simple_command (element, command)
/* If we are starting from scratch, then make the initial command
structure. Also note that we have to fill in all the slots, since
malloc doesn't return zeroed space. */
if (!command)
command = make_bare_simple_command ();
if (command == 0)
{
command = make_bare_simple_command ();
parser_state |= PST_REDIRLIST;
}
if (element.word)
command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
{
command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
parser_state &= ~PST_REDIRLIST;
}
else if (element.redirect)
{
REDIRECT *r = element.redirect;
@@ -544,6 +551,7 @@ make_simple_command (element, command)
r->next = command->value.Simple->redirects;
command->value.Simple->redirects = element.redirect;
}
return (command);
}
@@ -827,6 +835,7 @@ clean_simple_command (command)
REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
}
parser_state &= ~PST_REDIRLIST;
return (command);
}
+887
View File
@@ -0,0 +1,887 @@
/* make_cmd.c -- Functions for making instances of the various
parser constructs. */
/* Copyright (C) 1989-2009 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
Bash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Bash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bash. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <stdio.h>
#include "bashtypes.h"
#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
# include <sys/file.h>
#endif
#include "filecntl.h"
#include "bashansi.h"
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
#include "bashintl.h"
#include "parser.h"
#include "syntax.h"
#include "command.h"
#include "general.h"
#include "error.h"
#include "flags.h"
#include "make_cmd.h"
#include "dispose_cmd.h"
#include "variables.h"
#include "subst.h"
#include "input.h"
#include "ocache.h"
#include "externs.h"
#if defined (JOB_CONTROL)
#include "jobs.h"
#endif
#include "shmbutil.h"
extern int line_number, current_command_line_count, parser_state;
extern int last_command_exit_value;
/* Object caching */
sh_obj_cache_t wdcache = {0, 0, 0};
sh_obj_cache_t wlcache = {0, 0, 0};
#define WDCACHESIZE 60
#define WLCACHESIZE 60
static COMMAND *make_for_or_select __P((enum command_type, WORD_DESC *, WORD_LIST *, COMMAND *, int));
#if defined (ARITH_FOR_COMMAND)
static WORD_LIST *make_arith_for_expr __P((char *));
#endif
static COMMAND *make_until_or_while __P((enum command_type, COMMAND *, COMMAND *));
void
cmd_init ()
{
ocache_create (wdcache, WORD_DESC, WDCACHESIZE);
ocache_create (wlcache, WORD_LIST, WLCACHESIZE);
}
WORD_DESC *
alloc_word_desc ()
{
WORD_DESC *temp;
ocache_alloc (wdcache, WORD_DESC, temp);
temp->flags = 0;
temp->word = 0;
return temp;
}
WORD_DESC *
make_bare_word (string)
const char *string;
{
WORD_DESC *temp;
temp = alloc_word_desc ();
if (*string)
temp->word = savestring (string);
else
{
temp->word = (char *)xmalloc (1);
temp->word[0] = '\0';
}
return (temp);
}
WORD_DESC *
make_word_flags (w, string)
WORD_DESC *w;
const char *string;
{
register int i;
size_t slen;
DECLARE_MBSTATE;
i = 0;
slen = strlen (string);
while (i < slen)
{
switch (string[i])
{
case '$':
w->flags |= W_HASDOLLAR;
break;
case '\\':
break; /* continue the loop */
case '\'':
case '`':
case '"':
w->flags |= W_QUOTED;
break;
}
ADVANCE_CHAR (string, slen, i);
}
return (w);
}
WORD_DESC *
make_word (string)
const char *string;
{
WORD_DESC *temp;
temp = make_bare_word (string);
return (make_word_flags (temp, string));
}
WORD_DESC *
make_word_from_token (token)
int token;
{
char tokenizer[2];
tokenizer[0] = token;
tokenizer[1] = '\0';
return (make_word (tokenizer));
}
WORD_LIST *
make_word_list (word, wlink)
WORD_DESC *word;
WORD_LIST *wlink;
{
WORD_LIST *temp;
ocache_alloc (wlcache, WORD_LIST, temp);
temp->word = word;
temp->next = wlink;
return (temp);
}
COMMAND *
make_command (type, pointer)
enum command_type type;
SIMPLE_COM *pointer;
{
COMMAND *temp;
temp = (COMMAND *)xmalloc (sizeof (COMMAND));
temp->type = type;
temp->value.Simple = pointer;
temp->value.Simple->flags = temp->flags = 0;
temp->redirects = (REDIRECT *)NULL;
return (temp);
}
COMMAND *
command_connect (com1, com2, connector)
COMMAND *com1, *com2;
int connector;
{
CONNECTION *temp;
temp = (CONNECTION *)xmalloc (sizeof (CONNECTION));
temp->connector = connector;
temp->first = com1;
temp->second = com2;
return (make_command (cm_connection, (SIMPLE_COM *)temp));
}
static COMMAND *
make_for_or_select (type, name, map_list, action, lineno)
enum command_type type;
WORD_DESC *name;
WORD_LIST *map_list;
COMMAND *action;
int lineno;
{
FOR_COM *temp;
temp = (FOR_COM *)xmalloc (sizeof (FOR_COM));
temp->flags = 0;
temp->name = name;
temp->line = lineno;
temp->map_list = map_list;
temp->action = action;
return (make_command (type, (SIMPLE_COM *)temp));
}
COMMAND *
make_for_command (name, map_list, action, lineno)
WORD_DESC *name;
WORD_LIST *map_list;
COMMAND *action;
int lineno;
{
return (make_for_or_select (cm_for, name, map_list, action, lineno));
}
COMMAND *
make_select_command (name, map_list, action, lineno)
WORD_DESC *name;
WORD_LIST *map_list;
COMMAND *action;
int lineno;
{
#if defined (SELECT_COMMAND)
return (make_for_or_select (cm_select, name, map_list, action, lineno));
#else
last_command_exit_value = 2;
return ((COMMAND *)NULL);
#endif
}
#if defined (ARITH_FOR_COMMAND)
static WORD_LIST *
make_arith_for_expr (s)
char *s;
{
WORD_LIST *result;
WORD_DESC *wd;
if (s == 0 || *s == '\0')
return ((WORD_LIST *)NULL);
wd = make_word (s);
wd->flags |= W_NOGLOB|W_NOSPLIT|W_QUOTED|W_DQUOTE; /* no word splitting or globbing */
result = make_word_list (wd, (WORD_LIST *)NULL);
return result;
}
#endif
/* Note that this function calls dispose_words on EXPRS, since it doesn't
use the word list directly. We free it here rather than at the caller
because no other function in this file requires that the caller free
any arguments. */
COMMAND *
make_arith_for_command (exprs, action, lineno)
WORD_LIST *exprs;
COMMAND *action;
int lineno;
{
#if defined (ARITH_FOR_COMMAND)
ARITH_FOR_COM *temp;
WORD_LIST *init, *test, *step;
char *s, *t, *start;
int nsemi;
init = test = step = (WORD_LIST *)NULL;
/* Parse the string into the three component sub-expressions. */
start = t = s = exprs->word->word;
for (nsemi = 0; ;)
{
/* skip whitespace at the start of each sub-expression. */
while (whitespace (*s))
s++;
start = s;
/* skip to the semicolon or EOS */
while (*s && *s != ';')
s++;
t = (s > start) ? substring (start, 0, s - start) : (char *)NULL;
nsemi++;
switch (nsemi)
{
case 1:
init = make_arith_for_expr (t);
break;
case 2:
test = make_arith_for_expr (t);
break;
case 3:
step = make_arith_for_expr (t);
break;
}
FREE (t);
if (*s == '\0')
break;
s++; /* skip over semicolon */
}
if (nsemi != 3)
{
if (nsemi < 3)
parser_error (lineno, _("syntax error: arithmetic expression required"));
else
parser_error (lineno, _("syntax error: `;' unexpected"));
parser_error (lineno, _("syntax error: `((%s))'"), exprs->word->word);
last_command_exit_value = 2;
return ((COMMAND *)NULL);
}
temp = (ARITH_FOR_COM *)xmalloc (sizeof (ARITH_FOR_COM));
temp->flags = 0;
temp->line = lineno;
temp->init = init ? init : make_arith_for_expr ("1");
temp->test = test ? test : make_arith_for_expr ("1");
temp->step = step ? step : make_arith_for_expr ("1");
temp->action = action;
dispose_words (exprs);
return (make_command (cm_arith_for, (SIMPLE_COM *)temp));
#else
dispose_words (exprs);
last_command_exit_value = 2;
return ((COMMAND *)NULL);
#endif /* ARITH_FOR_COMMAND */
}
COMMAND *
make_group_command (command)
COMMAND *command;
{
GROUP_COM *temp;
temp = (GROUP_COM *)xmalloc (sizeof (GROUP_COM));
temp->command = command;
return (make_command (cm_group, (SIMPLE_COM *)temp));
}
COMMAND *
make_case_command (word, clauses, lineno)
WORD_DESC *word;
PATTERN_LIST *clauses;
int lineno;
{
CASE_COM *temp;
temp = (CASE_COM *)xmalloc (sizeof (CASE_COM));
temp->flags = 0;
temp->line = lineno;
temp->word = word;
temp->clauses = REVERSE_LIST (clauses, PATTERN_LIST *);
return (make_command (cm_case, (SIMPLE_COM *)temp));
}
PATTERN_LIST *
make_pattern_list (patterns, action)
WORD_LIST *patterns;
COMMAND *action;
{
PATTERN_LIST *temp;
temp = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST));
temp->patterns = REVERSE_LIST (patterns, WORD_LIST *);
temp->action = action;
temp->next = NULL;
temp->flags = 0;
return (temp);
}
COMMAND *
make_if_command (test, true_case, false_case)
COMMAND *test, *true_case, *false_case;
{
IF_COM *temp;
temp = (IF_COM *)xmalloc (sizeof (IF_COM));
temp->flags = 0;
temp->test = test;
temp->true_case = true_case;
temp->false_case = false_case;
return (make_command (cm_if, (SIMPLE_COM *)temp));
}
static COMMAND *
make_until_or_while (which, test, action)
enum command_type which;
COMMAND *test, *action;
{
WHILE_COM *temp;
temp = (WHILE_COM *)xmalloc (sizeof (WHILE_COM));
temp->flags = 0;
temp->test = test;
temp->action = action;
return (make_command (which, (SIMPLE_COM *)temp));
}
COMMAND *
make_while_command (test, action)
COMMAND *test, *action;
{
return (make_until_or_while (cm_while, test, action));
}
COMMAND *
make_until_command (test, action)
COMMAND *test, *action;
{
return (make_until_or_while (cm_until, test, action));
}
COMMAND *
make_arith_command (exp)
WORD_LIST *exp;
{
#if defined (DPAREN_ARITHMETIC)
COMMAND *command;
ARITH_COM *temp;
command = (COMMAND *)xmalloc (sizeof (COMMAND));
command->value.Arith = temp = (ARITH_COM *)xmalloc (sizeof (ARITH_COM));
temp->flags = 0;
temp->line = line_number;
temp->exp = exp;
command->type = cm_arith;
command->redirects = (REDIRECT *)NULL;
command->flags = 0;
return (command);
#else
last_command_exit_value = 2;
return ((COMMAND *)NULL);
#endif
}
#if defined (COND_COMMAND)
struct cond_com *
make_cond_node (type, op, left, right)
int type;
WORD_DESC *op;
struct cond_com *left, *right;
{
COND_COM *temp;
temp = (COND_COM *)xmalloc (sizeof (COND_COM));
temp->flags = 0;
temp->line = line_number;
temp->type = type;
temp->op = op;
temp->left = left;
temp->right = right;
return (temp);
}
#endif
COMMAND *
make_cond_command (cond_node)
COND_COM *cond_node;
{
#if defined (COND_COMMAND)
COMMAND *command;
command = (COMMAND *)xmalloc (sizeof (COMMAND));
command->value.Cond = cond_node;
command->type = cm_cond;
command->redirects = (REDIRECT *)NULL;
command->flags = 0;
command->line = cond_node ? cond_node->line : 0;
return (command);
#else
last_command_exit_value = 2;
return ((COMMAND *)NULL);
#endif
}
COMMAND *
make_bare_simple_command ()
{
COMMAND *command;
SIMPLE_COM *temp;
command = (COMMAND *)xmalloc (sizeof (COMMAND));
command->value.Simple = temp = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
temp->flags = 0;
temp->line = line_number;
temp->words = (WORD_LIST *)NULL;
temp->redirects = (REDIRECT *)NULL;
command->type = cm_simple;
command->redirects = (REDIRECT *)NULL;
command->flags = 0;
return (command);
}
/* Return a command which is the connection of the word or redirection
in ELEMENT, and the command * or NULL in COMMAND. */
COMMAND *
make_simple_command (element, command)
ELEMENT element;
COMMAND *command;
{
itrace("make_simple_command");
/* If we are starting from scratch, then make the initial command
structure. Also note that we have to fill in all the slots, since
malloc doesn't return zeroed space. */
if (command == 0)
{
command = make_bare_simple_command ();
parser_state |= PST_REDIRLIST;
}
if (element.word)
{
command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
parser_state &= ~PST_REDIRLIST;
}
else if (element.redirect)
{
REDIRECT *r = element.redirect;
/* Due to the way <> is implemented, there may be more than a single
redirection in element.redirect. We just follow the chain as far
as it goes, and hook onto the end. */
while (r->next)
r = r->next;
r->next = command->value.Simple->redirects;
command->value.Simple->redirects = element.redirect;
}
return (command);
}
/* Because we are Bourne compatible, we read the input for this
<< or <<- redirection now, from wherever input is coming from.
We store the input read into a WORD_DESC. Replace the text of
the redirectee.word with the new input text. If <<- is on,
then remove leading TABS from each line. */
void
make_here_document (temp, lineno)
REDIRECT *temp;
int lineno;
{
int kill_leading, redir_len;
char *redir_word, *document, *full_line;
int document_index, document_size, delim_unquoted;
if (temp->instruction != r_deblank_reading_until &&
temp->instruction != r_reading_until)
{
internal_error (_("make_here_document: bad instruction type %d"), temp->instruction);
return;
}
kill_leading = temp->instruction == r_deblank_reading_until;
document = (char *)NULL;
document_index = document_size = 0;
/* Quote removal is the only expansion performed on the delimiter
for here documents, making it an extremely special case. */
redir_word = string_quote_removal (temp->redirectee.filename->word, 0);
/* redirection_expand will return NULL if the expansion results in
multiple words or no words. Check for that here, and just abort
this here document if it does. */
if (redir_word)
redir_len = strlen (redir_word);
else
{
temp->here_doc_eof = (char *)xmalloc (1);
temp->here_doc_eof[0] = '\0';
goto document_done;
}
free (temp->redirectee.filename->word);
temp->here_doc_eof = redir_word;
/* Read lines from wherever lines are coming from.
For each line read, if kill_leading, then kill the
leading tab characters.
If the line matches redir_word exactly, then we have
manufactured the document. Otherwise, add the line to the
list of lines in the document. */
/* If the here-document delimiter was quoted, the lines should
be read verbatim from the input. If it was not quoted, we
need to perform backslash-quoted newline removal. */
delim_unquoted = (temp->redirectee.filename->flags & W_QUOTED) == 0;
while (full_line = read_secondary_line (delim_unquoted))
{
register char *line;
int len;
line = full_line;
line_number++;
/* If set -v is in effect, echo the line read. read_secondary_line/
read_a_line leaves the newline at the end, so don't print another. */
if (echo_input_at_read)
fprintf (stderr, "%s", line);
if (kill_leading && *line)
{
/* Hack: To be compatible with some Bourne shells, we
check the word before stripping the whitespace. This
is a hack, though. */
if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
goto document_done;
while (*line == '\t')
line++;
}
if (*line == 0)
continue;
if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
goto document_done;
len = strlen (line);
if (len + document_index >= document_size)
{
document_size = document_size ? 2 * (document_size + len) : len + 2;
document = (char *)xrealloc (document, document_size);
}
/* len is guaranteed to be > 0 because of the check for line
being an empty string before the call to strlen. */
FASTCOPY (line, document + document_index, len);
document_index += len;
}
if (full_line == 0)
internal_warning (_("here-document at line %d delimited by end-of-file (wanted `%s')"), lineno, redir_word);
document_done:
if (document)
document[document_index] = '\0';
else
{
document = (char *)xmalloc (1);
document[0] = '\0';
}
temp->redirectee.filename->word = document;
}
/* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION.
INSTRUCTION is the instruction type, SOURCE is a file descriptor,
and DEST is a file descriptor or a WORD_DESC *. */
REDIRECT *
make_redirection (source, instruction, dest_and_filename)
int source;
enum r_instruction instruction;
REDIRECTEE dest_and_filename;
{
REDIRECT *temp;
WORD_DESC *w;
int wlen;
intmax_t lfd;
temp = (REDIRECT *)xmalloc (sizeof (REDIRECT));
/* First do the common cases. */
temp->redirector = source;
temp->redirectee = dest_and_filename;
temp->instruction = instruction;
temp->flags = 0;
temp->next = (REDIRECT *)NULL;
switch (instruction)
{
case r_output_direction: /* >foo */
case r_output_force: /* >| foo */
case r_err_and_out: /* &>filename */
temp->flags = O_TRUNC | O_WRONLY | O_CREAT;
break;
case r_appending_to: /* >>foo */
case r_append_err_and_out: /* &>> filename */
temp->flags = O_APPEND | O_WRONLY | O_CREAT;
break;
case r_input_direction: /* <foo */
case r_inputa_direction: /* foo & makes this. */
temp->flags = O_RDONLY;
break;
case r_input_output: /* <>foo */
temp->flags = O_RDWR | O_CREAT;
break;
case r_deblank_reading_until: /* <<-foo */
case r_reading_until: /* << foo */
case r_reading_string: /* <<< foo */
case r_close_this: /* <&- */
case r_duplicating_input: /* 1<&2 */
case r_duplicating_output: /* 1>&2 */
break;
/* the parser doesn't pass these. */
case r_move_input: /* 1<&2- */
case r_move_output: /* 1>&2- */
case r_move_input_word: /* 1<&$foo- */
case r_move_output_word: /* 1>&$foo- */
break;
/* The way the lexer works we have to do this here. */
case r_duplicating_input_word: /* 1<&$foo */
case r_duplicating_output_word: /* 1>&$foo */
w = dest_and_filename.filename;
wlen = strlen (w->word) - 1;
if (w->word[wlen] == '-') /* Yuck */
{
w->word[wlen] = '\0';
if (all_digits (w->word) && legal_number (w->word, &lfd) && lfd == (int)lfd)
{
dispose_word (w);
temp->instruction = (instruction == r_duplicating_input_word) ? r_move_input : r_move_output;
temp->redirectee.dest = lfd;
}
else
temp->instruction = (instruction == r_duplicating_input_word) ? r_move_input_word : r_move_output_word;
}
break;
default:
programming_error (_("make_redirection: redirection instruction `%d' out of range"), instruction);
abort ();
break;
}
return (temp);
}
COMMAND *
make_function_def (name, command, lineno, lstart)
WORD_DESC *name;
COMMAND *command;
int lineno, lstart;
{
FUNCTION_DEF *temp;
#if defined (ARRAY_VARS)
SHELL_VAR *bash_source_v;
ARRAY *bash_source_a;
#endif
temp = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));
temp->command = command;
temp->name = name;
temp->line = lineno;
temp->flags = 0;
command->line = lstart;
/* Information used primarily for debugging. */
temp->source_file = 0;
#if defined (ARRAY_VARS)
GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
if (bash_source_a && array_num_elements (bash_source_a) > 0)
temp->source_file = array_reference (bash_source_a, 0);
#endif
#if defined (DEBUGGER)
bind_function_def (name->word, temp);
#endif
temp->source_file = 0;
return (make_command (cm_function_def, (SIMPLE_COM *)temp));
}
COMMAND *
make_subshell_command (command)
COMMAND *command;
{
SUBSHELL_COM *temp;
temp = (SUBSHELL_COM *)xmalloc (sizeof (SUBSHELL_COM));
temp->command = command;
temp->flags = CMD_WANT_SUBSHELL;
return (make_command (cm_subshell, (SIMPLE_COM *)temp));
}
COMMAND *
make_coproc_command (name, command)
char *name;
COMMAND *command;
{
COPROC_COM *temp;
temp = (COPROC_COM *)xmalloc (sizeof (COPROC_COM));
temp->name = savestring (name);
temp->command = command;
temp->flags = CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
return (make_command (cm_coproc, (SIMPLE_COM *)temp));
}
/* Reverse the word list and redirection list in the simple command
has just been parsed. It seems simpler to do this here the one
time then by any other method that I can think of. */
COMMAND *
clean_simple_command (command)
COMMAND *command;
{
if (command->type != cm_simple)
command_error ("clean_simple_command", CMDERR_BADTYPE, command->type, 0);
else
{
command->value.Simple->words =
REVERSE_LIST (command->value.Simple->words, WORD_LIST *);
command->value.Simple->redirects =
REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
}
parser_state &= ~PST_REDIRLIST;
return (command);
}
/* The Yacc grammar productions have a problem, in that they take a
list followed by an ampersand (`&') and do a simple command connection,
making the entire list effectively asynchronous, instead of just
the last command. This means that when the list is executed, all
the commands have stdin set to /dev/null when job control is not
active, instead of just the last. This is wrong, and needs fixing
up. This function takes the `&' and applies it to the last command
in the list. This is done only for lists connected by `;'; it makes
`;' bind `tighter' than `&'. */
COMMAND *
connect_async_list (command, command2, connector)
COMMAND *command, *command2;
int connector;
{
COMMAND *t, *t1, *t2;
t1 = command;
t = command->value.Connection->second;
if (!t || (command->flags & CMD_WANT_SUBSHELL) ||
command->value.Connection->connector != ';')
{
t = command_connect (command, command2, connector);
return t;
}
/* This is just defensive programming. The Yacc precedence rules
will generally hand this function a command where t points directly
to the command we want (e.g. given a ; b ; c ; d &, t1 will point
to the `a ; b ; c' list and t will be the `d'). We only want to do
this if the list is not being executed as a unit in the background
with `( ... )', so we have to check for CMD_WANT_SUBSHELL. That's
the only way to tell. */
while (((t->flags & CMD_WANT_SUBSHELL) == 0) && t->type == cm_connection &&
t->value.Connection->connector == ';')
{
t1 = t;
t = t->value.Connection->second;
}
/* Now we have t pointing to the last command in the list, and
t1->value.Connection->second == t. */
t2 = command_connect (t, command2, connector);
t1->value.Connection->second = t2;
return command;
}
+22 -5
View File
@@ -259,6 +259,9 @@ int shell_eof_token;
/* The token currently being read. */
int current_token;
/* The current parser state. */
int parser_state;
/* Variables to manage the task of reading here documents, because we need to
defer the reading until after a complete command has been collected. */
static REDIRECT *redir_stack[10];
@@ -283,9 +286,6 @@ static int function_bstart;
/* The line number in a script at which an arithmetic for command starts. */
static int arith_for_lineno;
/* The current parser state. */
static int parser_state;
/* The last read token, or NULL. read_token () uses this for context
checking. */
static int last_read_token;
@@ -1122,7 +1122,7 @@ pipeline: pipeline '|' newline_list pipeline
REDIRECTEE rd;
REDIRECT *r;
tc = $1;
tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
rd.dest = 1;
r = make_redirection (2, r_duplicating_output, rd);
if (tc->redirects)
@@ -2396,7 +2396,7 @@ gather_here_documents ()
static int open_brace_count;
#define command_token_position(token) \
(((token) == ASSIGNMENT_WORD) || \
(((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
#define assignment_acceptable(token) \
@@ -3262,6 +3262,23 @@ eof_error:
if (ch == '\n' && SHOULD_PROMPT ())
prompt_again ();
/* XXX -- possibly allow here doc to be delimited by ending right
paren. */
if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
{
int tind;
/*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
tind = lex_firstind;
while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
tind++;
if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
{
tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
/*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
lex_firstind = -1;
}
}
/* Don't bother counting parens or doing anything else if in a comment */
if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC))
{
+40 -31
View File
@@ -1122,7 +1122,7 @@ pipeline: pipeline '|' newline_list pipeline
REDIRECTEE rd;
REDIRECT *r;
tc = $1;
tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
rd.dest = 1;
r = make_redirection (2, r_duplicating_output, rd);
if (tc->redirects)
@@ -2921,18 +2921,17 @@ tokword:
#define P_ARRAYSUB 0x20 /* parsing a [...] array subscript for assignment */
/* Lexical state while parsing a grouping construct or $(...). */
#define LEX_WASDOL 0x0001
#define LEX_CKCOMMENT 0x0002
#define LEX_INCOMMENT 0x0004
#define LEX_PASSNEXT 0x0008
#define LEX_RESWDOK 0x0010
#define LEX_CKCASE 0x0020
#define LEX_INCASE 0x0040
#define LEX_INHEREDOC 0x0080
#define LEX_HEREDELIM 0x0100 /* reading here-doc delimiter */
#define LEX_STRIPDOC 0x0200 /* <<- strip tabs from here doc delim */
#define LEX_WASQUOTED 0x0400
#define LEX_INWORD 0x0800
#define LEX_WASDOL 0x001
#define LEX_CKCOMMENT 0x002
#define LEX_INCOMMENT 0x004
#define LEX_PASSNEXT 0x008
#define LEX_RESWDOK 0x010
#define LEX_CKCASE 0x020
#define LEX_INCASE 0x040
#define LEX_INHEREDOC 0x080
#define LEX_HEREDELIM 0x100 /* reading here-doc delimiter */
#define LEX_STRIPDOC 0x200 /* <<- strip tabs from here doc delim */
#define LEX_INWORD 0x400
#define COMSUB_META(ch) ((ch) == ';' || (ch) == '&' || (ch) == '|')
@@ -2955,11 +2954,6 @@ tokword:
} \
} while (0)
/* Not exactly right yet, should handle shell metacharacters, too. If
any changes are made to this test, make analogous changes to subst.c:
extract_delimited_string(). */
#define COMMENT_BEGIN(x) ((x) == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1])))
static char matched_pair_error;
static char *
@@ -3017,7 +3011,10 @@ parse_matched_pair (qc, open, close, lenp, flags)
continue;
}
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && COMMENT_BEGIN (ch))
/* Not exactly right yet, should handle shell metacharacters, too. If
any changes are made to this test, make analogous changes to subst.c:
extract_delimited_string(). */
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1])))
tflags |= LEX_INCOMMENT;
if (tflags & LEX_PASSNEXT) /* last char was backslash */
@@ -3197,7 +3194,7 @@ parse_comsub (qc, open, close, lenp, flags)
/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
count = 1;
tflags = LEX_RESWDOK|LEX_INWORD;
tflags = LEX_RESWDOK;
if ((flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0)
tflags |= LEX_CKCASE;
@@ -3273,7 +3270,10 @@ eof_error:
ret[retind++] = ch;
if ((tflags & LEX_INCOMMENT) && ch == '\n')
{
/*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/
tflags &= ~LEX_INCOMMENT;
}
continue;
}
@@ -3357,7 +3357,7 @@ eof_error:
}
/* Meta-characters that can introduce a reserved word. Not perfect yet. */
if MBTEST((tflags & LEX_PASSNEXT) == 0 && (tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && shellmeta(ch))
if MBTEST((tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && shellmeta(ch))
{
/* Add this character. */
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
@@ -3406,26 +3406,36 @@ eof_error:
if (STREQN (ret + retind - 4, "case", 4))
{
tflags |= LEX_INCASE;
/*itrace("parse_comsub:%d: found `case', lex_incase -> 1", line_number);*/
/*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/
}
else if (STREQN (ret + retind - 4, "esac", 4))
{
tflags &= ~LEX_INCASE;
/*itrace("parse_comsub:%d: found `esac', lex_incase -> 0", line_number);*/
/*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/
}
tflags &= ~LEX_RESWDOK;
}
else if MBTEST((tflags & LEX_CKCOMMENT) && ((lex_rwlen == 0 && ch == '#') || COMMENT_BEGIN(ch)))
; /* don't turn off LEX_RESWDOK if we're starting a comment */
else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0)))
; /* don't modify LEX_RESWDOK if we're starting a comment */
else if MBTEST((tflags & LEX_INCASE) && ch != '\n')
/* If we can read a reserved word and we're in case, we're at the
point where we can read a new pattern list or an esac. We
handle the esac case above. If we read a newline, we want to
leave LEX_RESWDOK alone. If we read anything else, we want to
turn off LEX_RESWDOK, since we're going to read a pattern list. */
{
tflags &= ~LEX_RESWDOK;
/*itrace("parse_comsub:%d: lex_incase == 1 found `%c', lex_reswordok -> 0", line_number, ch);*/
}
else if MBTEST(shellbreak (ch) == 0)
{
tflags &= ~LEX_RESWDOK;
tflags &= ~LEX_RESWDOK;
/*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/
}
}
/* Might be the start of a here-doc delimiter */
if MBTEST((tflags & (LEX_PASSNEXT|LEX_INCOMMENT)) == 0 && (tflags & LEX_CKCASE) && ch == '<')
if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<')
{
/* Add this character. */
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
@@ -3458,11 +3468,7 @@ eof_error:
else
ch = peekc; /* fall through and continue XXX */
}
#if 0
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0) || COMMENT_BEGIN(ch)))
#else
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0)))
#endif
{
/*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/
tflags |= LEX_INCOMMENT;
@@ -3485,7 +3491,10 @@ eof_error:
/*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/
}
else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
{
count++;
/*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
}
/* Add this character. */
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
+25 -8
View File
@@ -259,6 +259,9 @@ int shell_eof_token;
/* The token currently being read. */
int current_token;
/* The current parser state. */
int parser_state;
/* Variables to manage the task of reading here documents, because we need to
defer the reading until after a complete command has been collected. */
static REDIRECT *redir_stack[10];
@@ -283,9 +286,6 @@ static int function_bstart;
/* The line number in a script at which an arithmetic for command starts. */
static int arith_for_lineno;
/* The current parser state. */
static int parser_state;
/* The last read token, or NULL. read_token () uses this for context
checking. */
static int last_read_token;
@@ -1122,7 +1122,7 @@ pipeline: pipeline '|' newline_list pipeline
REDIRECTEE rd;
REDIRECT *r;
tc = $1;
tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
rd.dest = 1;
r = make_redirection (2, r_duplicating_output, rd);
if (tc->redirects)
@@ -2396,7 +2396,7 @@ gather_here_documents ()
static int open_brace_count;
#define command_token_position(token) \
(((token) == ASSIGNMENT_WORD) || \
(((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
#define assignment_acceptable(token) \
@@ -3258,6 +3258,23 @@ eof_error:
}
}
/* XXX -- possibly allow here doc to be delimited by ending right
paren. */
if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
{
int tind;
/*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
tind = lex_firstind;
while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
tind++;
if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
{
tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
/*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
lex_firstind = -1;
}
}
/* Possible reprompting. */
if (ch == '\n' && SHOULD_PROMPT ())
prompt_again ();
@@ -3470,7 +3487,7 @@ eof_error:
}
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0)))
{
itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);
/*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/
tflags |= LEX_INCOMMENT;
}
@@ -3488,12 +3505,12 @@ itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);
else if MBTEST(ch == close && (tflags & LEX_INCASE) == 0) /* ending delimiter */
{
count--;
itrace("parse_comsub:%d: found close: count = %d", line_number, count);
/*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/
}
else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
{
count++;
itrace("parse_comsub:%d: found open: count = %d", line_number, count);
/*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
}
/* Add this character. */
+1
View File
@@ -45,6 +45,7 @@
#define PST_REGEXP 0x10000 /* parsing an ERE/BRE as a single word */
#define PST_HEREDOC 0x20000 /* reading body of here-document */
#define PST_REPARSE 0x40000 /* re-parsing in parse_string_to_word_list */
#define PST_REDIRLIST 0x80000 /* parsing a list of redirctions preceding a simple command name */
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
struct dstack {
+62
View File
@@ -0,0 +1,62 @@
/* parser.h -- Everything you wanted to know about the parser, but were
afraid to ask. */
/* Copyright (C) 1995, 2008,2009 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
Bash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Bash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bash. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined (_PARSER_H_)
# define _PARSER_H_
# include "command.h"
# include "input.h"
/* Possible states for the parser that require it to do special things. */
#define PST_CASEPAT 0x00001 /* in a case pattern list */
#define PST_ALEXPNEXT 0x00002 /* expand next word for aliases */
#define PST_ALLOWOPNBRC 0x00004 /* allow open brace for function def */
#define PST_NEEDCLOSBRC 0x00008 /* need close brace */
#define PST_DBLPAREN 0x00010 /* double-paren parsing */
#define PST_SUBSHELL 0x00020 /* ( ... ) subshell */
#define PST_CMDSUBST 0x00040 /* $( ... ) command substitution */
#define PST_CASESTMT 0x00080 /* parsing a case statement */
#define PST_CONDCMD 0x00100 /* parsing a [[...]] command */
#define PST_CONDEXPR 0x00200 /* parsing the guts of [[...]] */
#define PST_ARITHFOR 0x00400 /* parsing an arithmetic for command */
#define PST_ALEXPAND 0x00800 /* OK to expand aliases - unused */
#define PST_CMDTOKEN 0x01000 /* command token OK - unused */
#define PST_COMPASSIGN 0x02000 /* parsing x=(...) compound assignment */
#define PST_ASSIGNOK 0x04000 /* assignment statement ok in this context */
#define PST_EOFTOKEN 0x08000 /* yylex checks against shell_eof_token */
#define PST_REGEXP 0x10000 /* parsing an ERE/BRE as a single word */
#define PST_HEREDOC 0x20000 /* reading body of here-document */
#define PST_REPARSE 0x40000 /* re-parsing in parse_string_to_word_list */
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
struct dstack {
/* DELIMITERS is a stack of the nested delimiters that we have
encountered so far. */
char *delimiters;
/* Offset into the stack of delimiters. */
int delimiter_depth;
/* How many slots are allocated to DELIMITERS. */
int delimiter_space;
};
#endif /* _PARSER_H_ */
+1 -1
View File
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
#define PATCHLEVEL 0
#define PATCHLEVEL 10
#endif /* _PATCHLEVEL_H_ */
+35 -14
View File
@@ -85,6 +85,7 @@ extern int errno;
/* Flags for the `pflags' argument to param_expand() */
#define PF_NOCOMSUB 0x01 /* Do not perform command substitution */
#define PF_IGNUNBOUND 0x02 /* ignore unbound vars even if -u set */
/* These defs make it easier to use the editor. */
#define LBRACE '{'
@@ -263,7 +264,7 @@ static int valid_brace_expansion_word __P((char *, int));
static int chk_atstar __P((char *, int, int *, int *));
static int chk_arithsub __P((const char *, int));
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int));
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int, int));
static WORD_DESC *parameter_brace_expand_indir __P((char *, int, int, int *, int *));
static WORD_DESC *parameter_brace_expand_rhs __P((char *, char *, int, int, int *, int *));
static void parameter_brace_expand_error __P((char *, char *));
@@ -2057,7 +2058,7 @@ string_list_dollar_at (list, quoted)
#if 0
tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
#else
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
#endif
? quote_list (list)
: list_quote_escapes (list);
@@ -4312,6 +4313,12 @@ expand_word_unsplit (word, quoted)
WORD_LIST *result;
expand_no_split_dollar_star = 1;
#if defined (HANDLE_MULTIBYTE)
if (ifs_firstc[0] == 0)
#else
if (ifs_firstc == 0)
#endif
word->flags |= W_NOSPLIT;
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
expand_no_split_dollar_star = 0;
@@ -4319,13 +4326,26 @@ expand_word_unsplit (word, quoted)
}
/* Perform shell expansions on WORD, but do not perform word splitting or
quote removal on the result. */
quote removal on the result. Virtually identical to expand_word_unsplit;
could be combined if implementations don't diverge. */
WORD_LIST *
expand_word_leave_quoted (word, quoted)
WORD_DESC *word;
int quoted;
{
return (call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL));
WORD_LIST *result;
expand_no_split_dollar_star = 1;
#if defined (HANDLE_MULTIBYTE)
if (ifs_firstc[0] == 0)
#else
if (ifs_firstc == 0)
#endif
word->flags |= W_NOSPLIT;
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
expand_no_split_dollar_star = 0;
return result;
}
#if defined (PROCESS_SUBSTITUTION)
@@ -5195,9 +5215,9 @@ chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at)
the shell, e.g., "@", "$", "*", etc. QUOTED, if non-zero, means that
NAME was found inside of a double-quoted expression. */
static WORD_DESC *
parameter_brace_expand_word (name, var_is_special, quoted)
parameter_brace_expand_word (name, var_is_special, quoted, pflags)
char *name;
int var_is_special, quoted;
int var_is_special, quoted, pflags;
{
WORD_DESC *ret;
char *temp, *tt;
@@ -5229,7 +5249,7 @@ parameter_brace_expand_word (name, var_is_special, quoted)
strcpy (tt + 1, name);
ret = param_expand (tt, &sindex, quoted, (int *)NULL, (int *)NULL,
(int *)NULL, (int *)NULL, 0);
(int *)NULL, (int *)NULL, pflags);
free (tt);
}
#if defined (ARRAY_VARS)
@@ -5290,7 +5310,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
char *temp, *t;
WORD_DESC *w;
w = parameter_brace_expand_word (name, var_is_special, quoted);
w = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
t = w->word;
/* Have to dequote here if necessary */
if (t)
@@ -5307,7 +5327,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
if (t == 0)
return (WORD_DESC *)NULL;
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted);
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted, 0);
free (t);
return w;
@@ -6658,7 +6678,7 @@ parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_doll
if (want_indir)
tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
else
tdesc = parameter_brace_expand_word (name, var_is_special, quoted);
tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
if (tdesc)
{
@@ -6989,7 +7009,7 @@ param_expand (string, sindex, quoted, expanded_something,
case '*': /* `$*' */
list = list_rest_of_args ();
if (list == 0 && unbound_vars_is_error)
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
{
uerror[0] = '$';
uerror[1] = '*';
@@ -7004,14 +7024,14 @@ param_expand (string, sindex, quoted, expanded_something,
even if it's quoted. */
if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list == 0)
temp = (char *)NULL;
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
{
/* If we have "$*" we want to make a string of the positional
parameters, separated by the first character of $IFS, and
quote the whole string, including the separators. If IFS
is unset, the parameters are separated by ' '; if $IFS is
null, the parameters are concatenated. */
temp = (quoted & Q_DOUBLE_QUOTES) ? string_list_dollar_star (list) : string_list (list);
temp = (quoted & (Q_DOUBLE_QUOTES|Q_PATQUOTE)) ? string_list_dollar_star (list) : string_list (list);
temp1 = quote_string (temp);
if (*temp == 0)
tflag |= W_HASQUOTEDNULL;
@@ -7051,7 +7071,7 @@ param_expand (string, sindex, quoted, expanded_something,
case '@': /* `$@' */
list = list_rest_of_args ();
if (list == 0 && unbound_vars_is_error)
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
{
uerror[0] = '$';
uerror[1] = '@';
@@ -7066,6 +7086,7 @@ param_expand (string, sindex, quoted, expanded_something,
string might need it (consider "\"$@\""), but we need some
way to signal that the final split on the first character
of $IFS should be done, even though QUOTED is 1. */
/* XXX - should this test include Q_PATQUOTE? */
if (quoted_dollar_at_p && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
*quoted_dollar_at_p = 1;
if (contains_dollar_at)
+8821
View File
File diff suppressed because it is too large Load Diff
+26 -16
View File
@@ -85,6 +85,7 @@ extern int errno;
/* Flags for the `pflags' argument to param_expand() */
#define PF_NOCOMSUB 0x01 /* Do not perform command substitution */
#define PF_IGNUNBOUND 0x02 /* ignore unbound vars even if -u set */
/* These defs make it easier to use the editor. */
#define LBRACE '{'
@@ -263,7 +264,7 @@ static int valid_brace_expansion_word __P((char *, int));
static int chk_atstar __P((char *, int, int *, int *));
static int chk_arithsub __P((const char *, int));
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int));
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int, int));
static WORD_DESC *parameter_brace_expand_indir __P((char *, int, int, int *, int *));
static WORD_DESC *parameter_brace_expand_rhs __P((char *, char *, int, int, int *, int *));
static void parameter_brace_expand_error __P((char *, char *));
@@ -1110,7 +1111,7 @@ extract_delimited_string (string, sindex, opener, alt_opener, closer, flags)
}
/* Not exactly right yet; should handle shell metacharacters and
multibyte characters, too. */
multibyte characters, too. See COMMENT_BEGIN define in parse.y */
if ((flags & SX_COMMAND) && c == '#' && (i == 0 || string[i - 1] == '\n' || shellblank (string[i - 1])))
{
in_comment = 1;
@@ -2057,7 +2058,7 @@ string_list_dollar_at (list, quoted)
#if 0
tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
#else
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
#endif
? quote_list (list)
: list_quote_escapes (list);
@@ -4312,6 +4313,7 @@ expand_word_unsplit (word, quoted)
WORD_LIST *result;
expand_no_split_dollar_star = 1;
word->flags |= W_NOSPLIT;
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
expand_no_split_dollar_star = 0;
@@ -4319,13 +4321,21 @@ expand_word_unsplit (word, quoted)
}
/* Perform shell expansions on WORD, but do not perform word splitting or
quote removal on the result. */
quote removal on the result. Virtually identical to expand_word_unsplit;
could be combined if implementations don't diverge. */
WORD_LIST *
expand_word_leave_quoted (word, quoted)
WORD_DESC *word;
int quoted;
{
return (call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL));
WORD_LIST *result;
expand_no_split_dollar_star = 1;
word->flags |= W_NOSPLIT;
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
expand_no_split_dollar_star = 0;
return result;
}
#if defined (PROCESS_SUBSTITUTION)
@@ -4476,7 +4486,6 @@ unlink_fifo_list ()
for (i = 0; nfds && i < totfds; i++)
if (dev_fd_list[i])
{
itrace("unlink_fifo_list: closing %d", i);
close (i);
dev_fd_list[i] = 0;
nfds--;
@@ -5196,9 +5205,9 @@ chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at)
the shell, e.g., "@", "$", "*", etc. QUOTED, if non-zero, means that
NAME was found inside of a double-quoted expression. */
static WORD_DESC *
parameter_brace_expand_word (name, var_is_special, quoted)
parameter_brace_expand_word (name, var_is_special, quoted, pflags)
char *name;
int var_is_special, quoted;
int var_is_special, quoted, pflags;
{
WORD_DESC *ret;
char *temp, *tt;
@@ -5230,7 +5239,7 @@ parameter_brace_expand_word (name, var_is_special, quoted)
strcpy (tt + 1, name);
ret = param_expand (tt, &sindex, quoted, (int *)NULL, (int *)NULL,
(int *)NULL, (int *)NULL, 0);
(int *)NULL, (int *)NULL, pflags);
free (tt);
}
#if defined (ARRAY_VARS)
@@ -5291,7 +5300,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
char *temp, *t;
WORD_DESC *w;
w = parameter_brace_expand_word (name, var_is_special, quoted);
w = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
t = w->word;
/* Have to dequote here if necessary */
if (t)
@@ -5308,7 +5317,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
if (t == 0)
return (WORD_DESC *)NULL;
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted);
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted, 0);
free (t);
return w;
@@ -6659,7 +6668,7 @@ parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_doll
if (want_indir)
tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
else
tdesc = parameter_brace_expand_word (name, var_is_special, quoted);
tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
if (tdesc)
{
@@ -6990,7 +6999,7 @@ param_expand (string, sindex, quoted, expanded_something,
case '*': /* `$*' */
list = list_rest_of_args ();
if (list == 0 && unbound_vars_is_error)
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
{
uerror[0] = '$';
uerror[1] = '*';
@@ -7005,14 +7014,14 @@ param_expand (string, sindex, quoted, expanded_something,
even if it's quoted. */
if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list == 0)
temp = (char *)NULL;
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
{
/* If we have "$*" we want to make a string of the positional
parameters, separated by the first character of $IFS, and
quote the whole string, including the separators. If IFS
is unset, the parameters are separated by ' '; if $IFS is
null, the parameters are concatenated. */
temp = (quoted & Q_DOUBLE_QUOTES) ? string_list_dollar_star (list) : string_list (list);
temp = (quoted & (Q_DOUBLE_QUOTES|Q_PATQUOTE)) ? string_list_dollar_star (list) : string_list (list);
temp1 = quote_string (temp);
if (*temp == 0)
tflag |= W_HASQUOTEDNULL;
@@ -7052,7 +7061,7 @@ param_expand (string, sindex, quoted, expanded_something,
case '@': /* `$@' */
list = list_rest_of_args ();
if (list == 0 && unbound_vars_is_error)
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
{
uerror[0] = '$';
uerror[1] = '@';
@@ -7067,6 +7076,7 @@ param_expand (string, sindex, quoted, expanded_something,
string might need it (consider "\"$@\""), but we need some
way to signal that the final split on the first character
of $IFS should be done, even though QUOTED is 1. */
/* XXX - should this test include Q_PATQUOTE? */
if (quoted_dollar_at_p && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
*quoted_dollar_at_p = 1;
if (contains_dollar_at)
+8
View File
@@ -2,3 +2,11 @@ alias: 0
alias: 0
./alias.tests: line 25: qfoo: command not found
quux
bar
value
bar
value
OK
OK
OK
OK
+2
View File
@@ -35,3 +35,5 @@ alias baz=quux
foo bar
unalias foo bar baz
${THIS_SH} ./alias1.sub
+20
View File
@@ -0,0 +1,20 @@
shopt -s expand_aliases
alias foo=echo
< /dev/null foo bar
< /dev/null x=value
echo $x
< /dev/null x=newvalue foo bar
echo $x
# problem reported by Vincent Lefevre
alias a="echo OK >&2"
a
> /dev/null a
${THIS_SH} -c 'shopt -s expand_aliases; alias a="echo OK >&2"
a
> /dev/null a'
+1
View File
@@ -3,3 +3,4 @@ to here
and here
retest
and match
no more clauses
+4
View File
@@ -12,3 +12,7 @@ foo*) echo retest ;;&
*bar) echo and match ;;&
qux) echo but not this ;;
esac
case a in
a) echo no more clauses;&
esac
+2
View File
@@ -5,3 +5,5 @@ hi
hi
./comsub-eof3.sub: line 1: unexpected EOF while looking for matching `)'
./comsub-eof3.sub: line 5: syntax error: unexpected end of file
./comsub-eof4.sub: line 6: warning: here-document at line 4 delimited by end-of-file (wanted `EOF')
contents
+2
View File
@@ -5,3 +5,5 @@ ${THIS_SH} ./comsub-eof1.sub
${THIS_SH} ./comsub-eof2.sub
${THIS_SH} ./comsub-eof3.sub
${THIS_SH} ./comsub-eof4.sub
+4
View File
@@ -0,0 +1,4 @@
e=$(cat <<EOF
contents
EOF)
echo $e
+5
View File
@@ -227,4 +227,9 @@ ${THIS_SH} ./dollar-star2.sub
# default and the array contains null elements
${THIS_SH} ./dollar-star3.sub
# test for set -u and expansions of $@ when there are no positional parameters
${THIS_SH} ./dollar-at3.sub
# test for set -u and expansions of $* when there are no positional parameters
${THIS_SH} ./dollar-star4.sub
exit 0
+7
View File
@@ -0,0 +1,7 @@
set -u
echo ${#@}
echo ${@:-bar}
echo $@
echo after
+7
View File
@@ -0,0 +1,7 @@
set -u
echo ${#*}
echo ${*:-bar}
echo ${*}
echo after
+6
View File
@@ -149,3 +149,9 @@ argv[1] = <ooq>
argv[2] = <>
argv[3] = <arq>
argv[4] = <>
0
bar
./dollar-at3.sub: line 6: $@: unbound variable
0
bar
./dollar-star4.sub: line 6: *: unbound variable