From de8913bd2016d25e1f0e4bb1ef251d77e8936f6d Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Sat, 3 Dec 2011 12:56:49 -0500 Subject: [PATCH] commit bash-20040422 snapshot --- CWRU/CWRU.chlog | 26 + CWRU/CWRU.chlog~ | 25 + builtins/alias.def | 5 +- builtins/common.c | 6 +- builtins/common.c~ | 8 - builtins/common.h | 2 +- builtins/common.h~ | 161 ++ builtins/jobs.def | 5 +- builtins/jobs.def.save1 | 281 +++ builtins/jobs.def~ | 283 +++ builtins/kill.def | 4 +- builtins/kill.def.save1 | 250 ++ builtins/kill.def~ | 250 ++ builtins/wait.def | 10 +- builtins/wait.def.save1 | 183 ++ builtins/wait.def~ | 177 ++ doc/bash.0 | 44 +- doc/bash.1 | 22 +- doc/bash.html | 23 +- doc/bash.ps | 288 +-- doc/bashref.dvi | Bin 579212 -> 579284 bytes doc/bashref.html | 32 +- doc/bashref.info | 283 +-- doc/bashref.log | 8 +- doc/bashref.ps | 124 +- doc/bashref.texi | 24 +- doc/bashref.texi~ | 24 +- doc/builtins.0 | 40 +- doc/builtins.ps | 22 +- doc/rbash.0 | 4 +- doc/rbash.ps | 22 +- doc/version.texi | 6 +- jobs.c | 1 + jobs.c~ | 4 +- lib/readline/doc/rluser.texi | 2 +- lib/readline/doc/rluser.texi~ | 1824 ++++++++++++++ njobs.c | 3535 ++++++++++++++++++++++++++++ po/bash.pot | 7 +- po/bash.pot~ | 4174 +++++++++++++++++++++++++++++++++ po/en@boldquot.po | 5 + po/en@quot.po | 5 + subst.c | 19 + subst.c.save1 | 573 ++++- subst.c~ | 15 +- support/bashbug.sh | 56 +- support/bashbug.sh.orig | 294 +++ support/bashbug.sh~ | 271 +++ tests/jobs.right | 2 +- tests/jobs.right~ | 97 + tests/jobs.tests | 2 +- tests/jobs.tests~ | 179 ++ 51 files changed, 13072 insertions(+), 635 deletions(-) create mode 100644 builtins/common.h~ create mode 100644 builtins/jobs.def.save1 create mode 100644 builtins/jobs.def~ create mode 100644 builtins/kill.def.save1 create mode 100644 builtins/kill.def~ create mode 100644 builtins/wait.def.save1 create mode 100644 builtins/wait.def~ create mode 100644 lib/readline/doc/rluser.texi~ create mode 100644 njobs.c create mode 100644 po/bash.pot~ create mode 100644 support/bashbug.sh.orig create mode 100644 support/bashbug.sh~ create mode 100644 tests/jobs.right~ create mode 100644 tests/jobs.tests~ diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 7b1681511..df2936caf 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -9367,3 +9367,29 @@ builtins/alias.def include/shmbutil.h - include for definition of HANDLE_MULTIBYTE rather than duplicating logic + + 4/20 + ---- + +doc/{bash.1,bashref.texi} + - make sure $0 is consistently referred to as a `special parameter' + - document which characters are now not allowed in alias names + + 4/23 + ---- + +builtins/{jobs,kill,wait}.def + - removed requirement that job control be enabled to use job control + notation, as SUSv3 implies + +subst.c + - based on a message from David Korn, change param_expand to not call + string_list_dollar_star if the only quoting is Q_HERE_DOCUMENT -- + quoted here documents are like double quoting, but not exactly + - analogous changes to list_remove_pattern and pos_params + + 4/24 + ---- +lib/readline/doc/rluser.texi + - fix error in description of emacs-mode C-xC-e command (uses $VISUAL + instead of $FCEDIT) diff --git a/CWRU/CWRU.chlog~ b/CWRU/CWRU.chlog~ index 126cd0c84..ea7dd1efe 100644 --- a/CWRU/CWRU.chlog~ +++ b/CWRU/CWRU.chlog~ @@ -9362,3 +9362,28 @@ builtins/alias.def - call legal_alias_name to make sure alias name is valid before calling add_alias from alias_builtin + 4/19 + ---- +include/shmbutil.h + - include for definition of HANDLE_MULTIBYTE rather than + duplicating logic + + 4/20 + ---- + +doc/{bash.1,bashref.texi} + - make sure $0 is consistently referred to as a `special parameter' + - document which characters are now not allowed in alias names + + 4/23 + ---- + +builtins/{jobs,kill,wait}.def + - removed requirement that job control be enabled to use job control + notation, as SUSv3 implies + +subst.c + - based on a message from David Korn, change param_expand to not call + string_list_dollar_star if the only quoting is Q_HERE_DOCUMENT -- + quoted here documents are like double quoting, but not exactly + - analogous changes to list_remove_pattern and pos_params diff --git a/builtins/alias.def b/builtins/alias.def index ec83d0b1d..572910bc4 100644 --- a/builtins/alias.def +++ b/builtins/alias.def @@ -1,7 +1,7 @@ This file is alias.def, from which is created alias.c It implements the builtins "alias" and "unalias" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2004 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -44,6 +44,7 @@ $END #endif # include "../bashansi.h" +# include "../bashintl.h" # include # include "../shell.h" @@ -120,7 +121,7 @@ alias_builtin (list) if (legal_alias_name (name, 0) == 0) { - builtin_error ("%s: invalid alias name", name); + builtin_error (_("`%s': invalid alias name"), name); any_failed++; } else diff --git a/builtins/common.c b/builtins/common.c index 7fd9155e4..bf0e14f5e 100644 --- a/builtins/common.c +++ b/builtins/common.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. +/* Copyright (C) 1987-2004 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -573,11 +573,7 @@ get_job_spec (list) word = list->word->word; if (*word == '\0') -#if 0 - return (current_job); -#else return (NO_JOB); -#endif if (*word == '%') word++; diff --git a/builtins/common.c~ b/builtins/common.c~ index 4a5648099..1542ffaf9 100644 --- a/builtins/common.c~ +++ b/builtins/common.c~ @@ -573,11 +573,7 @@ get_job_spec (list) word = list->word->word; if (*word == '\0') -#if 0 - return (current_job); -#else return (NO_JOB); -#endif if (*word == '%') word++; @@ -585,11 +581,7 @@ get_job_spec (list) if (DIGIT (*word) && all_digits (word)) { job = atoi (word); -#if 0 - return (job >= job_slots ? NO_JOB : job - 1); -#else return (job > job_slots ? NO_JOB : job - 1); -#endif } jflags = 0; diff --git a/builtins/common.h b/builtins/common.h index 309bb6d86..411ce1eb0 100644 --- a/builtins/common.h +++ b/builtins/common.h @@ -1,6 +1,6 @@ /* common.h -- extern declarations for functions defined in common.c. */ -/* Copyright (C) 1993-2002 Free Software Foundation, Inc. +/* Copyright (C) 1993-2004 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. diff --git a/builtins/common.h~ b/builtins/common.h~ new file mode 100644 index 000000000..309bb6d86 --- /dev/null +++ b/builtins/common.h~ @@ -0,0 +1,161 @@ +/* common.h -- extern declarations for functions defined in common.c. */ + +/* Copyright (C) 1993-2002 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 2, 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; see the file COPYING. If not, write to the Free Software + Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (__COMMON_H) +# define __COMMON_H + +#include "stdc.h" + +#define ISOPTION(s, c) (s[0] == '-' && !s[2] && s[1] == c) + +/* Flag values for parse_and_execute () */ +#define SEVAL_NONINT 0x001 +#define SEVAL_INTERACT 0x002 +#define SEVAL_NOHIST 0x004 +#define SEVAL_NOFREE 0x008 +#define SEVAL_RESETLINE 0x010 + +/* Flags for describe_command, shared between type.def and command.def */ +#define CDESC_ALL 0x001 /* type -a */ +#define CDESC_SHORTDESC 0x002 /* command -V */ +#define CDESC_REUSABLE 0x004 /* command -v */ +#define CDESC_TYPE 0x008 /* type -t */ +#define CDESC_PATH_ONLY 0x010 /* type -p */ +#define CDESC_FORCE_PATH 0x020 /* type -ap or type -P */ +#define CDESC_NOFUNCS 0x040 /* type -f */ + +/* Flags for get_job_by_name */ +#define JM_PREFIX 0x01 /* prefix of job name */ +#define JM_SUBSTRING 0x02 /* substring of job name */ +#define JM_EXACT 0x04 /* match job name exactly */ +#define JM_STOPPED 0x08 /* match stopped jobs only */ +#define JM_FIRSTMATCH 0x10 /* return first matching job */ + +/* Flags for remember_args and value of changed_dollar_vars */ +#define ARGS_NONE 0x0 +#define ARGS_INVOC 0x01 +#define ARGS_FUNC 0x02 +#define ARGS_SETBLTIN 0x04 + +/* Functions from common.c */ +extern void builtin_error __P((const char *, ...)) __attribute__((__format__ (printf, 1, 2))); +extern void builtin_usage __P((void)); +extern void no_args __P((WORD_LIST *)); +extern int no_options __P((WORD_LIST *)); + +/* common error message functions */ +extern void sh_needarg __P((char *)); +extern void sh_neednumarg __P((char *)); +extern void sh_notfound __P((char *)); +extern void sh_invalidopt __P((char *)); +extern void sh_invalidoptname __P((char *)); +extern void sh_invalidid __P((char *)); +extern void sh_invalidnum __P((char *)); +extern void sh_invalidsig __P((char *)); +extern void sh_erange __P((char *, char *)); +extern void sh_badpid __P((char *)); +extern void sh_badjob __P((char *)); +extern void sh_readonly __P((const char *)); +extern void sh_nojobs __P((char *)); +extern void sh_restricted __P((char *)); +extern void sh_notbuiltin __P((char *)); + +extern char **make_builtin_argv __P((WORD_LIST *, int *)); +extern void remember_args __P((WORD_LIST *, int)); + +extern int dollar_vars_changed __P((void)); +extern void set_dollar_vars_unchanged __P((void)); +extern void set_dollar_vars_changed __P((void)); + +extern intmax_t get_numeric_arg __P((WORD_LIST *, int)); +extern int get_exitstat __P((WORD_LIST *)); +extern int read_octal __P((char *)); + +/* Keeps track of the current working directory. */ +extern char *the_current_working_directory; +extern char *get_working_directory __P((char *)); +extern void set_working_directory __P((char *)); + +#if defined (JOB_CONTROL) +extern int get_job_by_name __P((const char *, int)); +extern int get_job_spec __P((WORD_LIST *)); +#endif +extern int display_signal_list __P((WORD_LIST *, int)); + +/* It's OK to declare a function as returning a Function * without + providing a definition of what a `Function' is. */ +extern struct builtin *builtin_address_internal __P((char *, int)); +extern sh_builtin_func_t *find_shell_builtin __P((char *)); +extern sh_builtin_func_t *builtin_address __P((char *)); +extern sh_builtin_func_t *find_special_builtin __P((char *)); +extern void initialize_shell_builtins __P((void)); + +/* Functions from exit.def */ +extern void bash_logout __P((void)); + +/* Functions from getopts.def */ +extern void getopts_reset __P((int)); + +/* Functions from set.def */ +extern int minus_o_option_value __P((char *)); +extern void list_minus_o_opts __P((int, int)); +extern char **get_minus_o_opts __P((void)); +extern int set_minus_o_option __P((int, char *)); + +extern void set_shellopts __P((void)); +extern void parse_shellopts __P((char *)); +extern void initialize_shell_options __P((int)); + +extern void reset_shell_options __P((void)); + +/* Functions from shopt.def */ +extern void reset_shopt_options __P((void)); +extern char **get_shopt_options __P((void)); + +extern int shopt_setopt __P((char *, int)); +extern int shopt_listopt __P((char *, int)); + +extern int set_login_shell __P((int)); + +/* Functions from type.def */ +extern int describe_command __P((char *, int)); + +/* Functions from setattr.def */ +extern int set_or_show_attributes __P((WORD_LIST *, int, int)); +extern int show_var_attributes __P((SHELL_VAR *, int, int)); +extern int show_name_attributes __P((char *, int)); +extern void set_var_attribute __P((char *, int, int)); + +/* Functions from pushd.def */ +extern char *get_dirstack_from_string __P((char *)); +extern char *get_dirstack_element __P((intmax_t, int)); +extern void set_dirstack_element __P((intmax_t, int, char *)); +extern WORD_LIST *get_directory_stack __P((void)); + +/* Functions from evalstring.c */ +extern int parse_and_execute __P((char *, const char *, int)); +extern void parse_and_execute_cleanup __P((void)); + +/* Functions from evalfile.c */ +extern int maybe_execute_file __P((const char *, int)); +extern int source_file __P((const char *, int)); +extern int fc_execute_file __P((const char *)); + +#endif /* !__COMMON_H */ diff --git a/builtins/jobs.def b/builtins/jobs.def index a1f75ae29..76d1957f4 100644 --- a/builtins/jobs.def +++ b/builtins/jobs.def @@ -1,7 +1,7 @@ This file is jobs.def, from which is created jobs.c. It implements the builtins "jobs" and "disown" in Bash. -Copyright (C) 1987-2003 Free Software Foundation, Inc. +Copyright (C) 1987-2004 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -75,9 +75,6 @@ jobs_builtin (list) int form, execute, state, opt, any_failed, job; sigset_t set, oset; - if (job_control == 0 && interactive_shell == 0) - return (EXECUTION_SUCCESS); - execute = any_failed = 0; form = JLIST_STANDARD; state = JSTATE_ANY; diff --git a/builtins/jobs.def.save1 b/builtins/jobs.def.save1 new file mode 100644 index 000000000..a1f75ae29 --- /dev/null +++ b/builtins/jobs.def.save1 @@ -0,0 +1,281 @@ +This file is jobs.def, from which is created jobs.c. +It implements the builtins "jobs" and "disown" in Bash. + +Copyright (C) 1987-2003 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 2, 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; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES jobs.c + +$BUILTIN jobs +$FUNCTION jobs_builtin +$DEPENDS_ON JOB_CONTROL +$SHORT_DOC jobs [-lnprs] [jobspec ...] or jobs -x command [args] +Lists the active jobs. The -l option lists process id's in addition +to the normal information; the -p option lists process id's only. +If -n is given, only processes that have changed status since the last +notification are printed. JOBSPEC restricts output to that job. The +-r and -s options restrict output to running and stopped jobs only, +respectively. Without options, the status of all active jobs is +printed. If -x is given, COMMAND is run after all job specifications +that appear in ARGS have been replaced with the process ID of that job's +process group leader. +$END + +#include + +#if defined (JOB_CONTROL) +#include "../bashtypes.h" +#include +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "../bashansi.h" +#include "../bashintl.h" + +#include "../shell.h" +#include "../jobs.h" +#include "../execute_cmd.h" +#include "bashgetopt.h" +#include "common.h" + +#define JSTATE_ANY 0x0 +#define JSTATE_RUNNING 0x1 +#define JSTATE_STOPPED 0x2 + +static int execute_list_with_replacements __P((WORD_LIST *)); + +/* The `jobs' command. Prints outs a list of active jobs. If the + argument `-l' is given, then the process id's are printed also. + If the argument `-p' is given, print the process group leader's + pid only. If `-n' is given, only processes that have changed + status since the last notification are printed. If -x is given, + replace all job specs with the pid of the appropriate process + group leader and execute the command. The -r and -s options mean + to print info about running and stopped jobs only, respectively. */ +int +jobs_builtin (list) + WORD_LIST *list; +{ + int form, execute, state, opt, any_failed, job; + sigset_t set, oset; + + if (job_control == 0 && interactive_shell == 0) + return (EXECUTION_SUCCESS); + + execute = any_failed = 0; + form = JLIST_STANDARD; + state = JSTATE_ANY; + + reset_internal_getopt (); + while ((opt = internal_getopt (list, "lpnxrs")) != -1) + { + switch (opt) + { + case 'l': + form = JLIST_LONG; + break; + case 'p': + form = JLIST_PID_ONLY; + break; + case 'n': + form = JLIST_CHANGED_ONLY; + break; + case 'x': + if (form != JLIST_STANDARD) + { + builtin_error (_("no other options allowed with `-x'")); + return (EXECUTION_FAILURE); + } + execute++; + break; + case 'r': + state = JSTATE_RUNNING; + break; + case 's': + state = JSTATE_STOPPED; + break; + + default: + builtin_usage (); + return (EX_USAGE); + } + } + + list = loptend; + + if (execute) + return (execute_list_with_replacements (list)); + + if (!list) + { + switch (state) + { + case JSTATE_ANY: + list_all_jobs (form); + break; + case JSTATE_RUNNING: + list_running_jobs (form); + break; + case JSTATE_STOPPED: + list_stopped_jobs (form); + break; + } + return (EXECUTION_SUCCESS); + } + + while (list) + { + BLOCK_CHILD (set, oset); + job = get_job_spec (list); + + if ((job == NO_JOB) || !jobs || !jobs[job]) + { + sh_badjob (list->word->word); + any_failed++; + } + else if (job != DUP_JOB) + list_one_job ((JOB *)NULL, form, 0, job); + + UNBLOCK_CHILD (oset); + list = list->next; + } + return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS); +} + +static int +execute_list_with_replacements (list) + WORD_LIST *list; +{ + register WORD_LIST *l; + int job, result; + COMMAND *command; + + /* First do the replacement of job specifications with pids. */ + for (l = list; l; l = l->next) + { + if (l->word->word[0] == '%') /* we have a winner */ + { + job = get_job_spec (l); + + /* A bad job spec is not really a job spec! Pass it through. */ + if (job < 0 || job >= job_slots || !jobs[job]) + continue; + + free (l->word->word); + l->word->word = itos (jobs[job]->pgrp); + } + } + + /* Next make a new simple command and execute it. */ + begin_unwind_frame ("jobs_builtin"); + + command = make_bare_simple_command (); + command->value.Simple->words = copy_word_list (list); + command->value.Simple->redirects = (REDIRECT *)NULL; + command->flags |= CMD_INHIBIT_EXPANSION; + command->value.Simple->flags |= CMD_INHIBIT_EXPANSION; + + add_unwind_protect (dispose_command, command); + result = execute_command (command); + dispose_command (command); + + discard_unwind_frame ("jobs_builtin"); + return (result); +} +#endif /* JOB_CONTROL */ + +$BUILTIN disown +$FUNCTION disown_builtin +$DEPENDS_ON JOB_CONTROL +$SHORT_DOC disown [-h] [-ar] [jobspec ...] +By default, removes each JOBSPEC argument from the table of active jobs. +If the -h option is given, the job is not removed from the table, but is +marked so that SIGHUP is not sent to the job if the shell receives a +SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all +jobs from the job table; the -r option means to remove only running jobs. +$END + +#if defined (JOB_CONTROL) +int +disown_builtin (list) + WORD_LIST *list; +{ + int opt, job, retval, nohup_only, running_jobs, all_jobs; + sigset_t set, oset; + intmax_t pid_value; + + nohup_only = running_jobs = all_jobs = 0; + reset_internal_getopt (); + while ((opt = internal_getopt (list, "ahr")) != -1) + { + switch (opt) + { + case 'a': + all_jobs = 1; + break; + case 'h': + nohup_only = 1; + break; + case 'r': + running_jobs = 1; + break; + default: + builtin_usage (); + return (EX_USAGE); + } + } + list = loptend; + retval = EXECUTION_SUCCESS; + + /* `disown -a' or `disown -r' */ + if (list == 0 && (all_jobs || running_jobs)) + { + if (nohup_only) + nohup_all_jobs (running_jobs); + else + delete_all_jobs (running_jobs); + return (EXECUTION_SUCCESS); + } + + do + { + BLOCK_CHILD (set, oset); + job = (list && legal_number (list->word->word, &pid_value) && pid_value == (pid_t) pid_value) + ? get_job_by_pid ((pid_t) pid_value, 0) + : get_job_spec (list); + + if (job == NO_JOB || jobs == 0 || job < 0 || job >= job_slots || jobs[job] == 0) + { + sh_badjob (list ? list->word->word : "current"); + retval = EXECUTION_FAILURE; + } + else if (nohup_only) + nohup_job (job); + else + delete_job (job, 1); + UNBLOCK_CHILD (oset); + + if (list) + list = list->next; + } + while (list); + + return (retval); +} +#endif /* JOB_CONTROL */ diff --git a/builtins/jobs.def~ b/builtins/jobs.def~ new file mode 100644 index 000000000..38e2232c7 --- /dev/null +++ b/builtins/jobs.def~ @@ -0,0 +1,283 @@ +This file is jobs.def, from which is created jobs.c. +It implements the builtins "jobs" and "disown" in Bash. + +Copyright (C) 1987-2003 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 2, 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; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES jobs.c + +$BUILTIN jobs +$FUNCTION jobs_builtin +$DEPENDS_ON JOB_CONTROL +$SHORT_DOC jobs [-lnprs] [jobspec ...] or jobs -x command [args] +Lists the active jobs. The -l option lists process id's in addition +to the normal information; the -p option lists process id's only. +If -n is given, only processes that have changed status since the last +notification are printed. JOBSPEC restricts output to that job. The +-r and -s options restrict output to running and stopped jobs only, +respectively. Without options, the status of all active jobs is +printed. If -x is given, COMMAND is run after all job specifications +that appear in ARGS have been replaced with the process ID of that job's +process group leader. +$END + +#include + +#if defined (JOB_CONTROL) +#include "../bashtypes.h" +#include +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "../bashansi.h" +#include "../bashintl.h" + +#include "../shell.h" +#include "../jobs.h" +#include "../execute_cmd.h" +#include "bashgetopt.h" +#include "common.h" + +#define JSTATE_ANY 0x0 +#define JSTATE_RUNNING 0x1 +#define JSTATE_STOPPED 0x2 + +static int execute_list_with_replacements __P((WORD_LIST *)); + +/* The `jobs' command. Prints outs a list of active jobs. If the + argument `-l' is given, then the process id's are printed also. + If the argument `-p' is given, print the process group leader's + pid only. If `-n' is given, only processes that have changed + status since the last notification are printed. If -x is given, + replace all job specs with the pid of the appropriate process + group leader and execute the command. The -r and -s options mean + to print info about running and stopped jobs only, respectively. */ +int +jobs_builtin (list) + WORD_LIST *list; +{ + int form, execute, state, opt, any_failed, job; + sigset_t set, oset; + +#if 0 + if (job_control == 0 && interactive_shell == 0) + return (EXECUTION_SUCCESS); +#endif + + execute = any_failed = 0; + form = JLIST_STANDARD; + state = JSTATE_ANY; + + reset_internal_getopt (); + while ((opt = internal_getopt (list, "lpnxrs")) != -1) + { + switch (opt) + { + case 'l': + form = JLIST_LONG; + break; + case 'p': + form = JLIST_PID_ONLY; + break; + case 'n': + form = JLIST_CHANGED_ONLY; + break; + case 'x': + if (form != JLIST_STANDARD) + { + builtin_error (_("no other options allowed with `-x'")); + return (EXECUTION_FAILURE); + } + execute++; + break; + case 'r': + state = JSTATE_RUNNING; + break; + case 's': + state = JSTATE_STOPPED; + break; + + default: + builtin_usage (); + return (EX_USAGE); + } + } + + list = loptend; + + if (execute) + return (execute_list_with_replacements (list)); + + if (!list) + { + switch (state) + { + case JSTATE_ANY: + list_all_jobs (form); + break; + case JSTATE_RUNNING: + list_running_jobs (form); + break; + case JSTATE_STOPPED: + list_stopped_jobs (form); + break; + } + return (EXECUTION_SUCCESS); + } + + while (list) + { + BLOCK_CHILD (set, oset); + job = get_job_spec (list); + + if ((job == NO_JOB) || !jobs || !jobs[job]) + { + sh_badjob (list->word->word); + any_failed++; + } + else if (job != DUP_JOB) + list_one_job ((JOB *)NULL, form, 0, job); + + UNBLOCK_CHILD (oset); + list = list->next; + } + return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS); +} + +static int +execute_list_with_replacements (list) + WORD_LIST *list; +{ + register WORD_LIST *l; + int job, result; + COMMAND *command; + + /* First do the replacement of job specifications with pids. */ + for (l = list; l; l = l->next) + { + if (l->word->word[0] == '%') /* we have a winner */ + { + job = get_job_spec (l); + + /* A bad job spec is not really a job spec! Pass it through. */ + if (job < 0 || job >= job_slots || !jobs[job]) + continue; + + free (l->word->word); + l->word->word = itos (jobs[job]->pgrp); + } + } + + /* Next make a new simple command and execute it. */ + begin_unwind_frame ("jobs_builtin"); + + command = make_bare_simple_command (); + command->value.Simple->words = copy_word_list (list); + command->value.Simple->redirects = (REDIRECT *)NULL; + command->flags |= CMD_INHIBIT_EXPANSION; + command->value.Simple->flags |= CMD_INHIBIT_EXPANSION; + + add_unwind_protect (dispose_command, command); + result = execute_command (command); + dispose_command (command); + + discard_unwind_frame ("jobs_builtin"); + return (result); +} +#endif /* JOB_CONTROL */ + +$BUILTIN disown +$FUNCTION disown_builtin +$DEPENDS_ON JOB_CONTROL +$SHORT_DOC disown [-h] [-ar] [jobspec ...] +By default, removes each JOBSPEC argument from the table of active jobs. +If the -h option is given, the job is not removed from the table, but is +marked so that SIGHUP is not sent to the job if the shell receives a +SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all +jobs from the job table; the -r option means to remove only running jobs. +$END + +#if defined (JOB_CONTROL) +int +disown_builtin (list) + WORD_LIST *list; +{ + int opt, job, retval, nohup_only, running_jobs, all_jobs; + sigset_t set, oset; + intmax_t pid_value; + + nohup_only = running_jobs = all_jobs = 0; + reset_internal_getopt (); + while ((opt = internal_getopt (list, "ahr")) != -1) + { + switch (opt) + { + case 'a': + all_jobs = 1; + break; + case 'h': + nohup_only = 1; + break; + case 'r': + running_jobs = 1; + break; + default: + builtin_usage (); + return (EX_USAGE); + } + } + list = loptend; + retval = EXECUTION_SUCCESS; + + /* `disown -a' or `disown -r' */ + if (list == 0 && (all_jobs || running_jobs)) + { + if (nohup_only) + nohup_all_jobs (running_jobs); + else + delete_all_jobs (running_jobs); + return (EXECUTION_SUCCESS); + } + + do + { + BLOCK_CHILD (set, oset); + job = (list && legal_number (list->word->word, &pid_value) && pid_value == (pid_t) pid_value) + ? get_job_by_pid ((pid_t) pid_value, 0) + : get_job_spec (list); + + if (job == NO_JOB || jobs == 0 || job < 0 || job >= job_slots || jobs[job] == 0) + { + sh_badjob (list ? list->word->word : "current"); + retval = EXECUTION_FAILURE; + } + else if (nohup_only) + nohup_job (job); + else + delete_job (job, 1); + UNBLOCK_CHILD (oset); + + if (list) + list = list->next; + } + while (list); + + return (retval); +} +#endif /* JOB_CONTROL */ diff --git a/builtins/kill.def b/builtins/kill.def index fcd5f4685..d1b9f6daa 100644 --- a/builtins/kill.def +++ b/builtins/kill.def @@ -1,7 +1,7 @@ This file is kill.def, from which is created kill.c. It implements the builtin "kill" in Bash. -Copyright (C) 1987-2003 Free Software Foundation, Inc. +Copyright (C) 1987-2004 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -187,7 +187,7 @@ kill_builtin (list) builtin_error (_("%s: arguments must be process or job IDs"), list->word->word); CONTINUE_OR_FAIL; } - else if (*word && (interactive || job_control)) + else if (*word) /* Posix.2 says you can kill without job control active (4.32.4) */ { /* Must be a job spec. Check it out. */ int job; diff --git a/builtins/kill.def.save1 b/builtins/kill.def.save1 new file mode 100644 index 000000000..fcd5f4685 --- /dev/null +++ b/builtins/kill.def.save1 @@ -0,0 +1,250 @@ +This file is kill.def, from which is created kill.c. +It implements the builtin "kill" in Bash. + +Copyright (C) 1987-2003 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 2, 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; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES kill.c + +$BUILTIN kill +$FUNCTION kill_builtin +$SHORT_DOC kill [-s sigspec | -n signum | -sigspec] [pid | job]... or kill -l [sigspec] +Send the processes named by PID (or JOB) the signal SIGSPEC. If +SIGSPEC is not present, then SIGTERM is assumed. An argument of `-l' +lists the signal names; if arguments follow `-l' they are assumed to +be signal numbers for which names should be listed. Kill is a shell +builtin for two reasons: it allows job IDs to be used instead of +process IDs, and, if you have reached the limit on processes that +you can create, you don't have to start a process to kill another one. +$END + +#include + +#include +#include +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashansi.h" +#include "../bashintl.h" + +#include "../shell.h" +#include "../trap.h" +#include "../jobs.h" +#include "common.h" + +/* Not all systems declare ERRNO in errno.h... and some systems #define it! */ +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +extern int posixly_correct; + +static void kill_error __P((pid_t, int)); + +#if !defined (CONTINUE_AFTER_KILL_ERROR) +# define CONTINUE_OR_FAIL return (EXECUTION_FAILURE) +#else +# define CONTINUE_OR_FAIL goto continue_killing +#endif /* CONTINUE_AFTER_KILL_ERROR */ + +/* Here is the kill builtin. We only have it so that people can type + kill -KILL %1? No, if you fill up the process table this way you + can still kill some. */ +int +kill_builtin (list) + WORD_LIST *list; +{ + int sig, any_succeeded, listing, saw_signal, dflags; + char *sigspec, *word; + pid_t pid; + intmax_t pid_value; + + if (list == 0) + { + builtin_usage (); + return (EXECUTION_FAILURE); + } + + any_succeeded = listing = saw_signal = 0; + sig = SIGTERM; + sigspec = "TERM"; + + dflags = DSIG_NOCASE | ((posixly_correct == 0) ? DSIG_SIGPREFIX : 0); + /* Process options. */ + while (list) + { + word = list->word->word; + + if (ISOPTION (word, 'l')) + { + listing++; + list = list->next; + } + else if (ISOPTION (word, 's') || ISOPTION (word, 'n')) + { + list = list->next; + if (list) + { + sigspec = list->word->word; + if (sigspec[0] == '0' && sigspec[1] == '\0') + sig = 0; + else + sig = decode_signal (sigspec, dflags); + list = list->next; + } + else + { + sh_needarg (word); + return (EXECUTION_FAILURE); + } + } + else if (ISOPTION (word, '-')) + { + list = list->next; + break; + } + else if (ISOPTION (word, '?')) + { + builtin_usage (); + return (EXECUTION_SUCCESS); + } + /* If this is a signal specification then process it. We only process + the first one seen; other arguments may signify process groups (e.g, + -num == process group num). */ + else if ((*word == '-') && !saw_signal) + { + sigspec = word + 1; + sig = decode_signal (sigspec, dflags); + saw_signal++; + list = list->next; + } + else + break; + } + + if (listing) + return (display_signal_list (list, 0)); + + /* OK, we are killing processes. */ + if (sig == NO_SIG) + { + sh_invalidsig (sigspec); + return (EXECUTION_FAILURE); + } + + if (list == 0) + { + builtin_usage (); + return (EXECUTION_FAILURE); + } + + while (list) + { + word = list->word->word; + + if (*word == '-') + word++; + + /* Use the entire argument in case of minus sign presence. */ + if (*word && legal_number (list->word->word, &pid_value) && (pid_value == (pid_t)pid_value)) + { + pid = (pid_t) pid_value; + + if ((pid < -1 ? kill_pid (-pid, sig, 1) : kill_pid (pid, sig, 0)) < 0) + { + if (errno == EINVAL) + sh_invalidsig (sigspec); + else + kill_error (pid, errno); + CONTINUE_OR_FAIL; + } + else + any_succeeded++; + } +#if defined (JOB_CONTROL) + else if (*list->word->word && *list->word->word != '%') + { + builtin_error (_("%s: arguments must be process or job IDs"), list->word->word); + CONTINUE_OR_FAIL; + } + else if (*word && (interactive || job_control)) + /* Posix.2 says you can kill without job control active (4.32.4) */ + { /* Must be a job spec. Check it out. */ + int job; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + job = get_job_spec (list); + + if (job < 0 || job >= job_slots || !jobs[job]) + { + if (job != DUP_JOB) + sh_badjob (list->word->word); + UNBLOCK_CHILD (oset); + CONTINUE_OR_FAIL; + } + + /* Job spec used. Kill the process group. If the job was started + without job control, then its pgrp == shell_pgrp, so we have + to be careful. We take the pid of the first job in the pipeline + in that case. */ + pid = IS_JOBCONTROL (job) ? jobs[job]->pgrp : jobs[job]->pipe->pid; + + UNBLOCK_CHILD (oset); + + if (kill_pid (pid, sig, 1) < 0) + { + if (errno == EINVAL) + sh_invalidsig (sigspec); + else + kill_error (pid, errno); + CONTINUE_OR_FAIL; + } + else + any_succeeded++; + } +#endif /* !JOB_CONTROL */ + else + { + sh_badpid (list->word->word); + CONTINUE_OR_FAIL; + } + continue_killing: + list = list->next; + } + + return (any_succeeded ? EXECUTION_SUCCESS : EXECUTION_FAILURE); +} + +static void +kill_error (pid, e) + pid_t pid; + int e; +{ + char *x; + + x = strerror (e); + if (x == 0) + x = _("Unknown error"); + builtin_error ("(%ld) - %s", (long)pid, x); +} diff --git a/builtins/kill.def~ b/builtins/kill.def~ new file mode 100644 index 000000000..77f52afcb --- /dev/null +++ b/builtins/kill.def~ @@ -0,0 +1,250 @@ +This file is kill.def, from which is created kill.c. +It implements the builtin "kill" in Bash. + +Copyright (C) 1987-2003 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 2, 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; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES kill.c + +$BUILTIN kill +$FUNCTION kill_builtin +$SHORT_DOC kill [-s sigspec | -n signum | -sigspec] [pid | job]... or kill -l [sigspec] +Send the processes named by PID (or JOB) the signal SIGSPEC. If +SIGSPEC is not present, then SIGTERM is assumed. An argument of `-l' +lists the signal names; if arguments follow `-l' they are assumed to +be signal numbers for which names should be listed. Kill is a shell +builtin for two reasons: it allows job IDs to be used instead of +process IDs, and, if you have reached the limit on processes that +you can create, you don't have to start a process to kill another one. +$END + +#include + +#include +#include +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashansi.h" +#include "../bashintl.h" + +#include "../shell.h" +#include "../trap.h" +#include "../jobs.h" +#include "common.h" + +/* Not all systems declare ERRNO in errno.h... and some systems #define it! */ +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +extern int posixly_correct; + +static void kill_error __P((pid_t, int)); + +#if !defined (CONTINUE_AFTER_KILL_ERROR) +# define CONTINUE_OR_FAIL return (EXECUTION_FAILURE) +#else +# define CONTINUE_OR_FAIL goto continue_killing +#endif /* CONTINUE_AFTER_KILL_ERROR */ + +/* Here is the kill builtin. We only have it so that people can type + kill -KILL %1? No, if you fill up the process table this way you + can still kill some. */ +int +kill_builtin (list) + WORD_LIST *list; +{ + int sig, any_succeeded, listing, saw_signal, dflags; + char *sigspec, *word; + pid_t pid; + intmax_t pid_value; + + if (list == 0) + { + builtin_usage (); + return (EXECUTION_FAILURE); + } + + any_succeeded = listing = saw_signal = 0; + sig = SIGTERM; + sigspec = "TERM"; + + dflags = DSIG_NOCASE | ((posixly_correct == 0) ? DSIG_SIGPREFIX : 0); + /* Process options. */ + while (list) + { + word = list->word->word; + + if (ISOPTION (word, 'l')) + { + listing++; + list = list->next; + } + else if (ISOPTION (word, 's') || ISOPTION (word, 'n')) + { + list = list->next; + if (list) + { + sigspec = list->word->word; + if (sigspec[0] == '0' && sigspec[1] == '\0') + sig = 0; + else + sig = decode_signal (sigspec, dflags); + list = list->next; + } + else + { + sh_needarg (word); + return (EXECUTION_FAILURE); + } + } + else if (ISOPTION (word, '-')) + { + list = list->next; + break; + } + else if (ISOPTION (word, '?')) + { + builtin_usage (); + return (EXECUTION_SUCCESS); + } + /* If this is a signal specification then process it. We only process + the first one seen; other arguments may signify process groups (e.g, + -num == process group num). */ + else if ((*word == '-') && !saw_signal) + { + sigspec = word + 1; + sig = decode_signal (sigspec, dflags); + saw_signal++; + list = list->next; + } + else + break; + } + + if (listing) + return (display_signal_list (list, 0)); + + /* OK, we are killing processes. */ + if (sig == NO_SIG) + { + sh_invalidsig (sigspec); + return (EXECUTION_FAILURE); + } + + if (list == 0) + { + builtin_usage (); + return (EXECUTION_FAILURE); + } + + while (list) + { + word = list->word->word; + + if (*word == '-') + word++; + + /* Use the entire argument in case of minus sign presence. */ + if (*word && legal_number (list->word->word, &pid_value) && (pid_value == (pid_t)pid_value)) + { + pid = (pid_t) pid_value; + + if ((pid < -1 ? kill_pid (-pid, sig, 1) : kill_pid (pid, sig, 0)) < 0) + { + if (errno == EINVAL) + sh_invalidsig (sigspec); + else + kill_error (pid, errno); + CONTINUE_OR_FAIL; + } + else + any_succeeded++; + } +#if defined (JOB_CONTROL) + else if (*list->word->word && *list->word->word != '%') + { + builtin_error (_("%s: arguments must be process or job IDs"), list->word->word); + CONTINUE_OR_FAIL; + } + else if (*word) + /* Posix.2 says you can kill without job control active (4.32.4) */ + { /* Must be a job spec. Check it out. */ + int job; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + job = get_job_spec (list); + + if (job < 0 || job >= job_slots || !jobs[job]) + { + if (job != DUP_JOB) + sh_badjob (list->word->word); + UNBLOCK_CHILD (oset); + CONTINUE_OR_FAIL; + } + + /* Job spec used. Kill the process group. If the job was started + without job control, then its pgrp == shell_pgrp, so we have + to be careful. We take the pid of the first job in the pipeline + in that case. */ + pid = IS_JOBCONTROL (job) ? jobs[job]->pgrp : jobs[job]->pipe->pid; + + UNBLOCK_CHILD (oset); + + if (kill_pid (pid, sig, 1) < 0) + { + if (errno == EINVAL) + sh_invalidsig (sigspec); + else + kill_error (pid, errno); + CONTINUE_OR_FAIL; + } + else + any_succeeded++; + } +#endif /* !JOB_CONTROL */ + else + { + sh_badpid (list->word->word); + CONTINUE_OR_FAIL; + } + continue_killing: + list = list->next; + } + + return (any_succeeded ? EXECUTION_SUCCESS : EXECUTION_FAILURE); +} + +static void +kill_error (pid, e) + pid_t pid; + int e; +{ + char *x; + + x = strerror (e); + if (x == 0) + x = _("Unknown error"); + builtin_error ("(%ld) - %s", (long)pid, x); +} diff --git a/builtins/wait.def b/builtins/wait.def index 23c8b19f6..9eb66f609 100644 --- a/builtins/wait.def +++ b/builtins/wait.def @@ -1,7 +1,7 @@ This file is wait.def, from which is created wait.c. It implements the builtin "wait" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2004 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -141,7 +141,7 @@ wait_builtin (list) } } #if defined (JOB_CONTROL) - else if (job_control && *w) + else if (*w && *w == '%') /* Must be a job spec. Check it out. */ { int job; @@ -164,12 +164,6 @@ wait_builtin (list) UNBLOCK_CHILD (oset); status = wait_for_job (job); } - else if (job_control == 0 && *w == '%') - { - /* can't use jobspecs as arguments if job control is not active. */ - sh_nojobs ((char *)NULL); - status = EXECUTION_FAILURE; - } #endif /* JOB_CONTROL */ else { diff --git a/builtins/wait.def.save1 b/builtins/wait.def.save1 new file mode 100644 index 000000000..23c8b19f6 --- /dev/null +++ b/builtins/wait.def.save1 @@ -0,0 +1,183 @@ +This file is wait.def, from which is created wait.c. +It implements the builtin "wait" in Bash. + +Copyright (C) 1987-2002 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 2, 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; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$BUILTIN wait +$FUNCTION wait_builtin +$DEPENDS_ON JOB_CONTROL +$PRODUCES wait.c +$SHORT_DOC wait [n] +Wait for the specified process and report its termination status. If +N is not given, all currently active child processes are waited for, +and the return code is zero. N may be a process ID or a job +specification; if a job spec is given, all processes in the job's +pipeline are waited for. +$END + +$BUILTIN wait +$FUNCTION wait_builtin +$DEPENDS_ON !JOB_CONTROL +$SHORT_DOC wait [n] +Wait for the specified process and report its termination status. If +N is not given, all currently active child processes are waited for, +and the return code is zero. N is a process ID; if it is not given, +all child processes of the shell are waited for. +$END + +#include + +#include "../bashtypes.h" +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include + +#include "../bashansi.h" + +#include "../shell.h" +#include "../jobs.h" +#include "common.h" +#include "bashgetopt.h" + +extern int interrupt_immediately; +extern int wait_signal_received; + +procenv_t wait_intr_buf; + +/* Wait for the pid in LIST to stop or die. If no arguments are given, then + wait for all of the active background processes of the shell and return + 0. If a list of pids or job specs are given, return the exit status of + the last one waited for. */ + +#define WAIT_RETURN(s) \ + do \ + { \ + interrupt_immediately = old_interrupt_immediately;\ + return (s);\ + } \ + while (0) + +int +wait_builtin (list) + WORD_LIST *list; +{ + int status, code; + volatile int old_interrupt_immediately; + + USE_VAR(list); + + if (no_options (list)) + return (EX_USAGE); + list = loptend; + + old_interrupt_immediately = interrupt_immediately; + interrupt_immediately++; + + /* POSIX.2 says: When the shell is waiting (by means of the wait utility) + for asynchronous commands to complete, the reception of a signal for + which a trap has been set shall cause the wait utility to return + immediately with an exit status greater than 128, after which the trap + associated with the signal shall be taken. + + We handle SIGINT here; it's the only one that needs to be treated + specially (I think), since it's handled specially in {no,}jobs.c. */ + code = setjmp (wait_intr_buf); + if (code) + { + status = 128 + wait_signal_received; + WAIT_RETURN (status); + } + + /* We support jobs or pids. + wait [pid-or-job ...] */ + + /* But wait without any arguments means to wait for all of the shell's + currently active background processes. */ + if (list == 0) + { + wait_for_background_pids (); + WAIT_RETURN (EXECUTION_SUCCESS); + } + + status = EXECUTION_SUCCESS; + while (list) + { + pid_t pid; + char *w; + intmax_t pid_value; + + w = list->word->word; + if (DIGIT (*w)) + { + if (legal_number (w, &pid_value) && pid_value == (pid_t)pid_value) + { + pid = (pid_t)pid_value; + status = wait_for_single_pid (pid); + } + else + { + sh_badpid (w); + WAIT_RETURN (EXECUTION_FAILURE); + } + } +#if defined (JOB_CONTROL) + else if (job_control && *w) + /* Must be a job spec. Check it out. */ + { + int job; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + job = get_job_spec (list); + + if (job < 0 || job >= job_slots || !jobs[job]) + { + if (job != DUP_JOB) + sh_badjob (list->word->word); + UNBLOCK_CHILD (oset); + status = 127; /* As per Posix.2, section 4.70.2 */ + list = list->next; + continue; + } + + /* Job spec used. Wait for the last pid in the pipeline. */ + UNBLOCK_CHILD (oset); + status = wait_for_job (job); + } + else if (job_control == 0 && *w == '%') + { + /* can't use jobspecs as arguments if job control is not active. */ + sh_nojobs ((char *)NULL); + status = EXECUTION_FAILURE; + } +#endif /* JOB_CONTROL */ + else + { + sh_badpid (w); + status = EXECUTION_FAILURE; + } + list = list->next; + } + + WAIT_RETURN (status); +} diff --git a/builtins/wait.def~ b/builtins/wait.def~ new file mode 100644 index 000000000..53533bae5 --- /dev/null +++ b/builtins/wait.def~ @@ -0,0 +1,177 @@ +This file is wait.def, from which is created wait.c. +It implements the builtin "wait" in Bash. + +Copyright (C) 1987-2004 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 2, 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; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$BUILTIN wait +$FUNCTION wait_builtin +$DEPENDS_ON JOB_CONTROL +$PRODUCES wait.c +$SHORT_DOC wait [n] +Wait for the specified process and report its termination status. If +N is not given, all currently active child processes are waited for, +and the return code is zero. N may be a process ID or a job +specification; if a job spec is given, all processes in the job's +pipeline are waited for. +$END + +$BUILTIN wait +$FUNCTION wait_builtin +$DEPENDS_ON !JOB_CONTROL +$SHORT_DOC wait [n] +Wait for the specified process and report its termination status. If +N is not given, all currently active child processes are waited for, +and the return code is zero. N is a process ID; if it is not given, +all child processes of the shell are waited for. +$END + +#include + +#include "../bashtypes.h" +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include + +#include "../bashansi.h" + +#include "../shell.h" +#include "../jobs.h" +#include "common.h" +#include "bashgetopt.h" + +extern int interrupt_immediately; +extern int wait_signal_received; + +procenv_t wait_intr_buf; + +/* Wait for the pid in LIST to stop or die. If no arguments are given, then + wait for all of the active background processes of the shell and return + 0. If a list of pids or job specs are given, return the exit status of + the last one waited for. */ + +#define WAIT_RETURN(s) \ + do \ + { \ + interrupt_immediately = old_interrupt_immediately;\ + return (s);\ + } \ + while (0) + +int +wait_builtin (list) + WORD_LIST *list; +{ + int status, code; + volatile int old_interrupt_immediately; + + USE_VAR(list); + + if (no_options (list)) + return (EX_USAGE); + list = loptend; + + old_interrupt_immediately = interrupt_immediately; + interrupt_immediately++; + + /* POSIX.2 says: When the shell is waiting (by means of the wait utility) + for asynchronous commands to complete, the reception of a signal for + which a trap has been set shall cause the wait utility to return + immediately with an exit status greater than 128, after which the trap + associated with the signal shall be taken. + + We handle SIGINT here; it's the only one that needs to be treated + specially (I think), since it's handled specially in {no,}jobs.c. */ + code = setjmp (wait_intr_buf); + if (code) + { + status = 128 + wait_signal_received; + WAIT_RETURN (status); + } + + /* We support jobs or pids. + wait [pid-or-job ...] */ + + /* But wait without any arguments means to wait for all of the shell's + currently active background processes. */ + if (list == 0) + { + wait_for_background_pids (); + WAIT_RETURN (EXECUTION_SUCCESS); + } + + status = EXECUTION_SUCCESS; + while (list) + { + pid_t pid; + char *w; + intmax_t pid_value; + + w = list->word->word; + if (DIGIT (*w)) + { + if (legal_number (w, &pid_value) && pid_value == (pid_t)pid_value) + { + pid = (pid_t)pid_value; + status = wait_for_single_pid (pid); + } + else + { + sh_badpid (w); + WAIT_RETURN (EXECUTION_FAILURE); + } + } +#if defined (JOB_CONTROL) + else if (*w) + /* Must be a job spec. Check it out. */ + { + int job; + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + job = get_job_spec (list); + + if (job < 0 || job >= job_slots || !jobs[job]) + { + if (job != DUP_JOB) + sh_badjob (list->word->word); + UNBLOCK_CHILD (oset); + status = 127; /* As per Posix.2, section 4.70.2 */ + list = list->next; + continue; + } + + /* Job spec used. Wait for the last pid in the pipeline. */ + UNBLOCK_CHILD (oset); + status = wait_for_job (job); + } +#endif /* JOB_CONTROL */ + else + { + sh_badpid (w); + status = EXECUTION_FAILURE; + } + list = list->next; + } + + WAIT_RETURN (status); +} diff --git a/doc/bash.0 b/doc/bash.0 index 53ef150b1..ba8342399 100644 --- a/doc/bash.0 +++ b/doc/bash.0 @@ -1729,17 +1729,17 @@ AALLIIAASSEESS the first word of a simple command. The shell maintains a list of aliases that may be set and unset with the aalliiaass and uunnaalliiaass builtin commands (see SSHHEELLLL BBUUIILLTTIINN CCOOMMMMAANNDDSS below). The first word of each - command, if unquoted, is checked to see if it has an alias. If so, - that word is replaced by the text of the alias. The alias name and the - replacement text may contain any valid shell input, including the - _m_e_t_a_c_h_a_r_a_c_t_e_r_s listed above, with the exception that the alias name may - not contain _=. The first word of the replacement text is tested for - aliases, but a word that is identical to an alias being expanded is not - expanded a second time. This means that one may alias llss to llss --FF, for - instance, and bbaasshh does not try to recursively expand the replacement - text. If the last character of the alias value is a _b_l_a_n_k, then the - next command word following the alias is also checked for alias expan- - sion. + simple command, if unquoted, is checked to see if it has an alias. If + so, that word is replaced by the text of the alias. The characters //, + $$, ``, and == and any of the shell _m_e_t_a_c_h_a_r_a_c_t_e_r_s or quoting characters + listed above may not appear in an alias name. The replacement text may + contain any valid shell input, including shell metacharacters. The + first word of the replacement text is tested for aliases, but a word + that is identical to an alias being expanded is not expanded a second + time. This means that one may alias llss to llss --FF, for instance, and + bbaasshh does not try to recursively expand the replacement text. If the + last character of the alias value is a _b_l_a_n_k, then the next command + word following the alias is also checked for alias expansion. Aliases are created and listed with the aalliiaass command, and removed with the uunnaalliiaass command. @@ -1778,16 +1778,16 @@ FFUUNNCCTTIIOONNSS interpret them (contrast this with the execution of a shell script). When a function is executed, the arguments to the function become the positional parameters during its execution. The special parameter ## is - updated to reflect the change. Positional parameter 0 is unchanged. - The first element of the FFUUNNCCNNAAMMEE variable is set to the name of the - function while the function is executing. All other aspects of the - shell execution environment are identical between a function and its - caller with the exception that the DDEEBBUUGG trap (see the description of - the ttrraapp builtin under SSHHEELLLL BBUUIILLTTIINN CCOOMMMMAANNDDSS below) is not inherited - unless the function has been given the ttrraaccee attribute (see the - description of the ddeeccllaarree builtin below) or the --oo ffuunnccttrraaccee shell - option has been enabled with the sseett builtin (in which case all func- - tions inherit the DDEEBBUUGG trap). + updated to reflect the change. Special parameter 0 is unchanged. The + first element of the FFUUNNCCNNAAMMEE variable is set to the name of the func- + tion while the function is executing. All other aspects of the shell + execution environment are identical between a function and its caller + with the exception that the DDEEBBUUGG trap (see the description of the ttrraapp + builtin under SSHHEELLLL BBUUIILLTTIINN CCOOMMMMAANNDDSS below) is not inherited unless the + function has been given the ttrraaccee attribute (see the description of the + ddeeccllaarree builtin below) or the --oo ffuunnccttrraaccee shell option has been + enabled with the sseett builtin (in which case all functions inherit the + DDEEBBUUGG trap). Variables local to the function may be declared with the llooccaall builtin command. Ordinarily, variables and their values are shared between the @@ -4775,4 +4775,4 @@ BBUUGGSS -GNU Bash-3.0 2004 Jan 28 BASH(1) +GNU Bash-3.0 2004 Apr 20 BASH(1) diff --git a/doc/bash.1 b/doc/bash.1 index 8cab77fb2..4d1cc25da 100644 --- a/doc/bash.1 +++ b/doc/bash.1 @@ -6,12 +6,12 @@ .\" Case Western Reserve University .\" chet@po.CWRU.Edu .\" -.\" Last Change: Wed Jan 28 15:49:29 EST 2004 +.\" Last Change: Tue Apr 20 13:39:08 EDT 2004 .\" .\" bash_builtins, strip all but Built-Ins section .if \n(zZ=1 .ig zZ .if \n(zY=1 .ig zY -.TH BASH 1 "2004 Jan 28" "GNU Bash-3.0" +.TH BASH 1 "2004 Apr 20" "GNU Bash-3.0" .\" .\" There's some problem with having a `@' .\" in a tagged paragraph with the BSD man macros. @@ -3189,16 +3189,18 @@ builtin commands (see .SM .B SHELL BUILTIN COMMANDS below). -The first word of each command, if unquoted, +The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. -The alias name and the replacement text may contain any valid -shell input, including the -.I metacharacters -listed above, with the exception that the alias name may not -contain \fI=\fP. The first word of the replacement text is tested +The characters \fB/\fP, \fB$\fP, \fB`\fP, and \fB=\fP and +any of the shell \fImetacharacters\fP or quoting characters +listed above may not appear in an alias name. +The replacement text may contain any valid shell input, +including shell metacharacters. +The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded -is not expanded a second time. This means that one may alias +is not expanded a second time. +This means that one may alias .B ls to .BR "ls \-F" , @@ -3272,7 +3274,7 @@ function become the positional parameters during its execution. The special parameter .B # -is updated to reflect the change. Positional parameter 0 +is updated to reflect the change. Special parameter 0 is unchanged. The first element of the .SM diff --git a/doc/bash.html b/doc/bash.html index 5953d0684..77b63f80d 100644 --- a/doc/bash.html +++ b/doc/bash.html @@ -2,7 +2,7 @@ BASH(1) Manual Page -
BASH(1)2004 Jan 28BASH(1) +BASH(1)2004 Apr 20BASH(1)

Index
@@ -4156,17 +4156,18 @@ builtin commands (see below). -The first word of each command, if unquoted, +The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. -The alias name and the replacement text may contain any valid -shell input, including the -metacharacters - -listed above, with the exception that the alias name may not -contain =. The first word of the replacement text is tested +The characters /, $, `, and = and +any of the shell metacharacters or quoting characters +listed above may not appear in an alias name. +The replacement text may contain any valid shell input, +including shell metacharacters. +The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded -is not expanded a second time. This means that one may alias +is not expanded a second time. +This means that one may alias ls to @@ -4260,7 +4261,7 @@ during its execution. The special parameter # -is updated to reflect the change. Positional parameter 0 +is updated to reflect the change. Special parameter 0 is unchanged. The first element of the FUNCNAME @@ -11343,6 +11344,6 @@ Array variables may not (yet) be exported.
This document was created by man2html from bash.1.
-Time: 29 January 2004 16:59:30 EST +Time: 20 April 2004 15:26:54 EDT diff --git a/doc/bash.ps b/doc/bash.ps index 35be55611..a8c695509 100644 --- a/doc/bash.ps +++ b/doc/bash.ps @@ -1,6 +1,6 @@ %!PS-Adobe-3.0 -%%Creator: groff version 1.18.1 -%%CreationDate: Thu Jan 29 16:59:28 2004 +%%Creator: groff version 1.19 +%%CreationDate: Tue Apr 20 15:26:44 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic @@ -9,13 +9,17 @@ %%+ font Palatino-Roman %%+ font Palatino-Italic %%+ font Palatino-Bold -%%DocumentSuppliedResources: procset grops 1.18 1 +%%DocumentSuppliedResources: procset grops 1.19 0 %%Pages: 63 %%PageOrder: Ascend +%%DocumentMedia: Default 612 792 0 () () %%Orientation: Portrait %%EndComments +%%BeginDefaults +%%PageMedia: Default +%%EndDefaults %%BeginProlog -%%BeginResource: procset grops 1.18 1 +%%BeginResource: procset grops 1.19 0 /setpacking where{ pop currentpacking @@ -116,16 +120,22 @@ TM setmatrix /Fr{ setrgbcolor fill }bind def +/setcmykcolor where{ +pop /Fk{ setcmykcolor fill }bind def +}if /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def +/setcmykcolor where{ +pop /Ck/setcmykcolor load def +}if /Cg/setgray load def /RE{ findfont @@ -168,6 +178,7 @@ newpath /CNT countdictstack def userdict begin /showpage{}def +/setpagedevice{}def }bind def /PEND{ clear @@ -180,6 +191,9 @@ pop setpacking }if %%EndResource +%%BeginFeature: *PageSize Default +<< /PageSize [ 612 792 ] /ImagingBBox null >> setpagedevice +%%EndFeature %%IncludeResource: font Times-Roman %%IncludeResource: font Times-Bold %%IncludeResource: font Times-Italic @@ -321,7 +335,7 @@ E F2(po)2.5 E F0(\(portable object\) \214le format.)2.5 E F2 144 686.4 Q .3 -.15(ve \()-.25 H(see).15 E F4(INV)2.5 E(OCA)-.405 E (TION)-.855 E F0(belo)2.25 E(w\).)-.25 E F2(\255\255login)108 703.2 Q F0 (Equi)144 715.2 Q -.25(va)-.25 G(lent to).25 E F22.5 E F0(.)A -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(1)204.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(1)203.725 E 0 Cg EP %%Page: 2 2 %%BeginPageSetup BP @@ -444,7 +458,7 @@ F(ariable)-.25 E F3 -.27(BA)108 679.2 S(SH_ENV).27 E F0 1.01(in the en) 108 727.2 S 2.5(tt).2 G(he v)-2.5 E(alue of the)-.25 E F3 -.666(PA)2.5 G (TH)-.189 E F0 -.25(va)2.25 G (riable is not used to search for the \214le name.).25 E(GNU Bash-3.0)72 -768 Q(2004 Jan 28)149.845 E(2)204.835 E 0 Cg EP +768 Q(2004 Apr 20)148.735 E(2)203.725 E 0 Cg EP %%Page: 3 3 %%BeginPageSetup BP @@ -569,7 +583,7 @@ F1(Pipelines)87 679.2 Q F0(A)108 691.2 Q F2(pipeline)2.919 E F0 .419 F F1(|)2.92 E F0 5.42(.T)C .42(he format for a pipeline)-5.42 F(is:)108 703.2 Q([)144 720 Q F1(time)A F0([)2.5 E F1A F0(]] [ ! ])A F2 (command)2.5 E F0([)2.5 E F1(|)2.5 E F2(command2)2.5 E F0(... ])2.5 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(3)204.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(3)203.725 E 0 Cg EP %%Page: 4 4 %%BeginPageSetup BP @@ -689,7 +703,7 @@ A({)108 573.6 Q F1(list)2.5 E F0 2.5(;})C F1(list)3.89 E F0 .402 F(SIONS)144 727.2 Q F5(.)A F0 -.8(Wo)5.633 G 1.133 (rd splitting and pathname e).8 F 1.133 (xpansion are not performed on the w)-.15 F 1.133(ords between the)-.1 F -F3([[)3.632 E F0(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(4)204.835 E +F3([[)3.632 E F0(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(4)203.725 E 0 Cg EP %%Page: 5 5 %%BeginPageSetup @@ -829,7 +843,7 @@ F F2(name)144 727.2 Q F0 .759(to be set to null.)3.439 F .759 (The line read is sa)5.759 F -.15(ve)-.2 G 3.26(di).15 G 3.26(nt)-3.26 G .76(he v)-3.26 F(ariable)-.25 E F1(REPL)3.26 E(Y)-.92 E F0 5.76(.T)C(he) -5.76 E F2(list)3.35 E F0 .76(is e)3.94 F -.15(xe)-.15 G .76 -(cuted after).15 F(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(5)204.835 +(cuted after).15 F(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(5)203.725 E 0 Cg EP %%Page: 6 6 %%BeginPageSetup @@ -965,7 +979,7 @@ E(xpansion.)-.15 E(There are three quoting mechanisms: the)108 708 Q F2 G(he)-2.974 E F2 .474(escape c)2.974 F(har)-.15 E(acter)-.15 E F0 5.474 (.I).73 G 2.974(tp)-5.474 G(reserv)-2.974 E .474(es the literal v)-.15 F .474(alue of the ne)-.25 F .474(xt character that)-.15 F(GNU Bash-3.0)72 -768 Q(2004 Jan 28)149.845 E(6)204.835 E 0 Cg EP +768 Q(2004 Apr 20)148.735 E(6)203.725 E 0 Cg EP %%Page: 7 7 %%BeginPageSetup BP @@ -1082,7 +1096,7 @@ d by one or more digits, other than the single digit 0.)3.935 F(Posi-) 5.706 E .445(tional parameters are assigned from the shell')108 729.6 R 2.944(sa)-.55 G -.18(rg)-2.944 G .444(uments when it is in).18 F -.2(vo) -.4 G -.1(ke).2 G .444(d, and may be reassigned using).1 F(GNU Bash-3.0) -72 768 Q(2004 Jan 28)149.845 E(7)204.835 E 0 Cg EP +72 768 Q(2004 Apr 20)148.735 E(7)203.725 E 0 Cg EP %%Page: 8 8 %%BeginPageSetup BP @@ -1200,7 +1214,7 @@ F F1 -.3(BA)144 619.2 S(SH_ARGV).3 E F0(.)A F1 -.3(BA)108 631.2 S F F1(${FUNCN)144 727.2 Q(AME[)-.2 E F3 8.951($i + 1)B F1(]})A F0 -.1(wa) 11.451 G 11.451(sc).1 G 11.451(alled. The)-11.451 F 8.951 (corresponding source \214le name is)11.451 F(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(8)204.835 E 0 Cg EP +(2004 Apr 20)148.735 E(8)203.725 E 0 Cg EP %%Page: 9 9 %%BeginPageSetup BP @@ -1301,7 +1315,7 @@ F(ariable)-.25 E .351(will not change the current directory)144 711.6 R 5.35(.I)-.65 G(f)-5.35 E F3(DIRST)2.85 E -.495(AC)-.81 G(K).495 E F0 .35 (is unset, it loses its special properties, e)2.6 F -.15(ve)-.25 G 2.85 (ni).15 G(f)-2.85 E(it is subsequently reset.)144 723.6 Q(GNU Bash-3.0) -72 768 Q(2004 Jan 28)149.845 E(9)204.835 E 0 Cg EP +72 768 Q(2004 Apr 20)148.735 E(9)203.725 E 0 Cg EP %%Page: 10 10 %%BeginPageSetup BP @@ -1390,7 +1404,7 @@ R .01(alue to)-.25 F F2(RANDOM)2.51 E/F4 9/Times-Roman@0 SF(.)A F0(If) 4.51 E F2(RANDOM)2.51 E F0(is)2.26 E (unset, it loses its special properties, e)144 720 Q -.15(ve)-.25 G 2.5 (ni).15 G 2.5(fi)-2.5 G 2.5(ti)-2.5 G 2.5(ss)-2.5 G(ubsequently reset.) --2.5 E(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(10)199.835 E 0 Cg EP +-2.5 E(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(10)198.725 E 0 Cg EP %%Page: 11 11 %%BeginPageSetup BP @@ -1499,7 +1513,7 @@ me e)-3.118 F(xpan-)-.15 E 3.131(sion. If)144 640.8 R 3.132<618c>3.131 G (all pre)144 724.8 R .698 (vious lines matching the current line to be remo)-.25 F -.15(ve)-.15 G 3.198(df).15 G .698(rom the history list before that line is)-3.198 F -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(11)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(11)198.725 E 0 Cg EP %%Page: 12 12 %%BeginPageSetup BP @@ -1612,7 +1626,7 @@ E F1(LANG)108 648 Q F0 1.24(Used to determine the locale cate)7.11 F (rrides the v).15 F .764(alue of)-.25 F F1(LANG)3.264 E F0 .764(and an) 3.264 F 3.264(yo)-.15 G(ther)-3.264 E F1(LC_)3.264 E F0 -.25(va)3.264 G .764(riable specifying a locale cate-).25 F(gory)144 696 Q(.)-.65 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(12)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(12)198.725 E 0 Cg EP %%Page: 13 13 %%BeginPageSetup BP @@ -1716,8 +1730,8 @@ F0 1.225(displays during an e)3.725 F -.15(xe)-.15 G 1.225 E F0 1.226(is replicated multiple)3.476 F(times, as necessary)144 696 Q 2.5(,t)-.65 G 2.5(oi)-2.5 G(ndicate multiple le)-2.5 E -.15(ve)-.25 G (ls of indirection.).15 E(The def)5 E(ault is `)-.1 E(`)-.74 E F1(+)A F0 --.74('')2.5 G(.).74 E(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(13) -199.835 E 0 Cg EP +-.74('')2.5 G(.).74 E(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(13) +198.725 E 0 Cg EP %%Page: 14 14 %%BeginPageSetup BP @@ -1835,7 +1849,7 @@ G .961(or an)-3.461 F 3.461(yr)-.15 G(equirement)-3.461 E 1.302(An array is created automatically if an)108 728.4 R 3.801(yv)-.15 G 1.301(ariable is assigned to using the syntax)-4.051 F F2(name)3.801 E F0([)A F2(subscript)A F0(]=)A F2(value)A F0(.)A(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(14)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(14)198.725 E 0 Cg EP %%Page: 15 15 %%BeginPageSetup BP @@ -1987,7 +2001,7 @@ F0(must be of the same type.)2.5 E .582(Brace e)108 705.6 R .582 (does not apply an)2.516 F 2.516(ys)-.15 G .016 (yntactic interpretation to the con-)-2.516 F(te)108 729.6 Q (xt of the e)-.15 E(xpansion or the te)-.15 E(xt between the braces.) --.15 E(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(15)199.835 E 0 Cg EP +-.15 E(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(15)198.725 E 0 Cg EP %%Page: 16 16 %%BeginPageSetup BP @@ -2115,7 +2129,7 @@ E .351(able is then e)108 700.8 R .351(xpanded and that v)-.15 F .352 F2(@)A F0 .762(]} described belo)B 4.563 -.65(w. T)-.25 H .763(he e).65 F .763(xclamation point must immediately follo)-.15 F 3.263(wt)-.25 G .763(he left brace in order to)-3.263 F(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(16)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(16)198.725 E 0 Cg EP %%Page: 17 17 %%BeginPageSetup BP @@ -2238,7 +2252,7 @@ F1(par)145.25 664.8 Q(ameter)-.15 E F0 .607 3.151(,t)C .651(he pattern remo)-3.151 F -.25(va)-.15 G 3.151(lo).25 G .65(peration is applied to each member of the array in)-3.151 F (turn, and the e)144 712.8 Q(xpansion is the resultant list.)-.15 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(17)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(17)198.725 E 0 Cg EP %%Page: 18 18 %%BeginPageSetup BP @@ -2351,7 +2365,7 @@ F1 -.2(ex)2.666 G(pr).2 E(ession)-.37 E F0 .165 A F0(If)5.878 E F1 -.2(ex)108 705.6 S(pr).2 E(ession)-.37 E F0(is in) 2.74 E -.25(va)-.4 G(lid,).25 E F2(bash)2.5 E F0 (prints a message indicating f)2.5 E(ailure and no substitution occurs.) --.1 E(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(18)199.835 E 0 Cg EP +-.1 E(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(18)198.725 E 0 Cg EP %%Page: 19 19 %%BeginPageSetup BP @@ -2488,8 +2502,8 @@ R 1.12(NUL character may not occur in a pattern.)3.62 F 3.62(Ab)6.12 G (The special pattern characters must be quoted if the)5.576 F 3.076(ya) -.15 G(re)-3.076 E(to be matched literally)108 691.2 Q(.)-.65 E (The special pattern characters ha)108 708 Q .3 -.15(ve t)-.2 H -(he follo).15 E(wing meanings:)-.25 E(GNU Bash-3.0)72 768 Q(2004 Jan 28) -149.845 E(19)199.835 E 0 Cg EP +(he follo).15 E(wing meanings:)-.25 E(GNU Bash-3.0)72 768 Q(2004 Apr 20) +148.735 E(19)198.725 E 0 Cg EP %%Page: 20 20 %%BeginPageSetup BP @@ -2576,12 +2590,12 @@ F2 -.37(re)3.045 G(dir).37 E(ected)-.37 E F0 .545 (ywhere within a)-.15 F F2 .775(simple command)3.615 F F0(or)4.045 E (may follo)108 584.4 Q 2.5(wa)-.25 G F2(command)A F0 5(.R).77 G (edirections are processed in the order the)-5 E 2.5(ya)-.15 G(ppear) --2.5 E 2.5(,f)-.4 G(rom left to right.)-2.5 E .448(In the follo)108 -601.2 R .447(wing descriptions, if the \214le descriptor number is omit\ -ted, and the \214rst character of the redirec-)-.25 F .365 -(tion operator is)108 613.2 R F1(<)2.865 E F0 2.865(,t)C .366 +-2.5 E 2.5(,f)-.4 G(rom left to right.)-2.5 E .284(In the follo)108 +601.2 R .283(wing descriptions, if the \214le descriptor number is omit\ +ted, and the \214rst character of the redirect-)-.25 F .512 +(ion operator is)108 613.2 R F1(<)3.012 E F0 3.012(,t)C .512 (he redirection refers to the standard input \(\214le descriptor 0\).) --2.865 F .366(If the \214rst character of the)5.366 F +-3.012 F .512(If the \214rst character of the)5.512 F (redirection operator is)108 625.2 Q F1(>)2.5 E F0 2.5(,t)C (he redirection refers to the standard output \(\214le descriptor 1\).) -2.5 E .825(The w)108 642 R .825(ord follo)-.1 F .824 @@ -2599,7 +2613,7 @@ ted, and the \214rst character of the redirec-)-.25 F .365 E F0(dirlist 2)2.5 E F1(>&)A F0(1)A (directs both standard output and standard error to the \214le)108 728.4 Q F2(dirlist)2.5 E F0 2.5(,w).68 G(hile the command)-2.5 E(GNU Bash-3.0) -72 768 Q(2004 Jan 28)149.845 E(20)199.835 E 0 Cg EP +72 768 Q(2004 Apr 20)148.735 E(20)198.725 E 0 Cg EP %%Page: 21 21 %%BeginPageSetup BP @@ -2658,15 +2672,15 @@ F2(n)A F0(])A F1(>)A F2(wor)A(d)-.37 E F0 .155 (If the redirection operator is)108 508.8 R F1(>)2.655 E F0 2.655(,a)C .155(nd the)-2.655 F F1(noclob)2.655 E(ber)-.1 E F0 .154(option to the) 2.654 F F1(set)2.654 E F0 -.2(bu)2.654 G .154 -(iltin has been enabled, the redirection).2 F .076(will f)108 520.8 R -.076(ail if the \214le whose name results from the e)-.1 F .076 -(xpansion of)-.15 F F2(wor)2.576 E(d)-.37 E F0 -.15(ex)2.576 G .076 -(ists and is a re).15 F .077(gular \214le.)-.15 F .077(If the redirec-) -5.077 F .548(tion operator is)108 532.8 R F1(>|)3.048 E F0 3.048(,o)C -3.048(rt)-3.048 G .548(he redirection operator is)-3.048 F F1(>)3.047 E -F0 .547(and the)3.047 F F1(noclob)3.047 E(ber)-.1 E F0 .547 -(option to the)3.047 F F1(set)3.047 E F0 -.2(bu)3.047 G .547 -(iltin command is).2 F(not enabled, the redirection is attempted e)108 +(iltin has been enabled, the redirection).2 F .657(will f)108 520.8 R +.657(ail if the \214le whose name results from the e)-.1 F .658 +(xpansion of)-.15 F F2(wor)3.158 E(d)-.37 E F0 -.15(ex)3.158 G .658 +(ists and is a re).15 F .658(gular \214le.)-.15 F .658(If the redi-) +5.658 F .409(rection operator is)108 532.8 R F1(>|)2.909 E F0 2.909(,o)C +2.909(rt)-2.909 G .409(he redirection operator is)-2.909 F F1(>)2.909 E +F0 .409(and the)2.909 F F1(noclob)2.909 E(ber)-.1 E F0 .409 +(option to the)2.909 F F1(set)2.909 E F0 -.2(bu)2.908 G .408 +(iltin command).2 F(is not enabled, the redirection is attempted e)108 544.8 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(ft)-2.5 G(he \214le named by) -2.5 E F2(wor)2.5 E(d)-.37 E F0 -.15(ex)2.5 G(ists.).15 E F1 -.25(Ap)87 561.6 S(pending Redir).25 E(ected Output)-.18 E F0 .641 @@ -2688,7 +2702,7 @@ Q F0(allo)3.141 E .642(ws both the standard output \(\214le descriptor \ E(There are tw)108 693.6 Q 2.5(of)-.1 G (ormats for redirecting standard output and standard error:)-2.5 E F1 (&>)144 710.4 Q F2(wor)A(d)-.37 E F0(and)108 722.4 Q(GNU Bash-3.0)72 768 -Q(2004 Jan 28)149.845 E(21)199.835 E 0 Cg EP +Q(2004 Apr 20)148.735 E(21)198.725 E 0 Cg EP %%Page: 22 22 %%BeginPageSetup BP @@ -2775,7 +2789,7 @@ E F0(is closed after being duplicated to)2.5 E F2(n)2.5 E F0(.)A .24 G 2.786(rt)-2.786 G .285 (he standard output \(\214le descriptor 1\) if)-2.786 F F2(n)2.785 E F0 .285(is not speci-)2.785 F(\214ed.)108 705.6 Q(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(22)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(22)198.725 E 0 Cg EP %%Page: 23 23 %%BeginPageSetup BP @@ -2796,32 +2810,34 @@ E 3.174(was)-.25 G .674(tring to be substituted for a w)-3.174 F .674 (ord of a simple command.)-.1 F .394(The shell maintains a list of alia\ ses that may be set and unset with the)108 182.4 R F1(alias)2.894 E F0 (and)2.894 E F1(unalias)2.894 E F0 -.2(bu)2.894 G .394(iltin commands).2 -F(\(see)108 194.4 Q/F4 9/Times-Bold@0 SF .763(SHELL B)3.264 F(UIL)-.09 E -.763(TIN COMMANDS)-.828 F F0(belo)3.013 E 3.263(w\). The)-.25 F .763 -(\214rst w)3.263 F .763(ord of each command, if unquoted, is check)-.1 F -.763(ed to)-.1 F .633(see if it has an alias.)108 206.4 R .633 -(If so, that w)5.633 F .633(ord is replaced by the te)-.1 F .634 -(xt of the alias.)-.15 F .634(The alias name and the replace-)5.634 F -.538(ment te)108 218.4 R .538(xt may contain an)-.15 F 3.038(yv)-.15 G -.537(alid shell input, including the)-3.288 F F2(metac)3.417 E(har)-.15 -E(acter)-.15 E(s)-.1 E F0 .537(listed abo)3.307 F -.15(ve)-.15 G 3.037 -(,w).15 G .537(ith the e)-3.037 F(xception)-.15 E .996 -(that the alias name may not contain)108 230.4 R F2(=)3.496 E F0 5.996 -(.T)C .996(he \214rst w)-5.996 F .997(ord of the replacement te)-.1 F -.997(xt is tested for aliases, b)-.15 F .997(ut a)-.2 F -.1(wo)108 242.4 -S .495(rd that is identical to an alias being e).1 F .495 -(xpanded is not e)-.15 F .495(xpanded a second time.)-.15 F .494 -(This means that one may)5.494 F(alias)108 254.4 Q F1(ls)3.019 E F0(to) -3.019 E F1 .519(ls \255F)3.019 F F0 3.019(,f)C .519(or instance, and) --3.019 F F1(bash)3.019 E F0 .52(does not try to recursi)3.019 F -.15(ve) --.25 G .52(ly e).15 F .52(xpand the replacement te)-.15 F 3.02(xt. If) --.15 F .52(the last)3.02 F .441(character of the alias v)108 266.4 R -.441(alue is a)-.25 F F2(blank)2.941 E F0 2.941(,t).67 G .441 -(hen the ne)-2.941 F .441(xt command w)-.15 F .441(ord follo)-.1 F .441 -(wing the alias is also check)-.25 F .441(ed for)-.1 F(alias e)108 278.4 -Q(xpansion.)-.15 E(Aliases are created and listed with the)108 295.2 Q -F1(alias)2.5 E F0(command, and remo)2.5 E -.15(ve)-.15 G 2.5(dw).15 G -(ith the)-2.5 E F1(unalias)2.5 E F0(command.)2.5 E .284 +F(\(see)108 194.4 Q/F4 9/Times-Bold@0 SF 1.98(SHELL B)4.48 F(UIL)-.09 E +1.98(TIN COMMANDS)-.828 F F0(belo)4.23 E 4.48(w\). The)-.25 F 1.98 +(\214rst w)4.48 F 1.979(ord of each simple command, if unquoted, is)-.1 +F(check)108 206.4 Q .472(ed to see if it has an alias.)-.1 F .472 +(If so, that w)5.472 F .473(ord is replaced by the te)-.1 F .473 +(xt of the alias.)-.15 F .473(The characters)5.473 F F1(/)2.973 E F0(,)A +F1($)2.973 E F0(,)A F1(`)2.973 E F0(,)A(and)108 218.4 Q F1(=)3.612 E F0 +1.112(and an)3.612 F 3.612(yo)-.15 G 3.612(ft)-3.612 G 1.112(he shell) +-3.612 F F2(metac)3.612 E(har)-.15 E(acter)-.15 E(s)-.1 E F0 1.112 +(or quoting characters listed abo)3.612 F 1.411 -.15(ve m)-.15 H 1.111 +(ay not appear in an alias).15 F 3.619(name. The)108 230.4 R 1.119 +(replacement te)3.619 F 1.119(xt may contain an)-.15 F 3.619(yv)-.15 G +1.119(alid shell input, including shell metacharacters.)-3.869 F 1.12 +(The \214rst)6.12 F -.1(wo)108 242.4 S .514(rd of the replacement te).1 +F .514(xt is tested for aliases, b)-.15 F .514(ut a w)-.2 F .513 +(ord that is identical to an alias being e)-.1 F .513(xpanded is)-.15 F +.295(not e)108 254.4 R .295(xpanded a second time.)-.15 F .296 +(This means that one may alias)5.295 F F1(ls)2.796 E F0(to)2.796 E F1 +.296(ls \255F)2.796 F F0 2.796(,f)C .296(or instance, and)-2.796 F F1 +(bash)2.796 E F0 .296(does not try)2.796 F .543(to recursi)108 266.4 R +-.15(ve)-.25 G .543(ly e).15 F .543(xpand the replacement te)-.15 F +3.043(xt. If)-.15 F .543(the last character of the alias v)3.043 F .542 +(alue is a)-.25 F F2(blank)3.042 E F0 3.042(,t).67 G .542(hen the ne) +-3.042 F(xt)-.15 E(command w)108 278.4 Q(ord follo)-.1 E +(wing the alias is also check)-.25 E(ed for alias e)-.1 E(xpansion.)-.15 +E(Aliases are created and listed with the)108 295.2 Q F1(alias)2.5 E F0 +(command, and remo)2.5 E -.15(ve)-.15 G 2.5(dw).15 G(ith the)-2.5 E F1 +(unalias)2.5 E F0(command.)2.5 E .284 (There is no mechanism for using ar)108 312 R .284 (guments in the replacement te)-.18 F 2.784(xt. If)-.15 F(ar)2.784 E .284(guments are needed, a shell func-)-.18 F(tion should be used \(see) @@ -2877,13 +2893,13 @@ G 2.816(cuted. Functions).15 F .316(are e)2.816 F -.15(xe)-.15 G .316 F .639(function is e)108 559.2 R -.15(xe)-.15 G .639(cuted, the ar).15 F .639 (guments to the function become the positional parameters during its e) --.18 F -.15(xe)-.15 G(cution.).15 E .999(The special parameter)108 571.2 -R F1(#)3.498 E F0 .998(is updated to re\215ect the change.)3.498 F .998 -(Positional parameter 0 is unchanged.)5.998 F .998(The \214rst)5.998 F -.369(element of the)108 583.2 R F4(FUNCN)2.869 E(AME)-.18 E F0 -.25(va) -2.619 G .37 +-.18 F -.15(xe)-.15 G(cution.).15 E .533(The special parameter)108 571.2 +R F1(#)3.033 E F0 .532(is updated to re\215ect the change.)3.033 F .532 +(Special parameter 0 is unchanged.)5.532 F .532(The \214rst ele-)5.532 F +1.017(ment of the)108 583.2 R F4(FUNCN)3.517 E(AME)-.18 E F0 -.25(va) +3.267 G 1.017 (riable is set to the name of the function while the function is e).25 F --.15(xe)-.15 G 2.87(cuting. All).15 F 1.285 +-.15(xe)-.15 G 3.518(cuting. All).15 F 1.285 (other aspects of the shell e)108 595.2 R -.15(xe)-.15 G 1.285 (cution en).15 F 1.285 (vironment are identical between a function and its caller with the)-.4 @@ -2915,8 +2931,8 @@ F F1 .616(\255o functrace)3.115 F F0 .616 (alues of the positional parameters and the spe-)-.25 F(cial parameter) 108 724.8 Q F1(#)2.5 E F0(are restored to the v)2.5 E(alues the)-.25 E 2.5(yh)-.15 G(ad prior to the function')-2.5 E 2.5(se)-.55 G -.15(xe) --2.65 G(cution.).15 E(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(23) -199.835 E 0 Cg EP +-2.65 G(cution.).15 E(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(23) +198.725 E 0 Cg EP %%Page: 24 24 %%BeginPageSetup BP @@ -3018,7 +3034,7 @@ H .343(ts inte).15 F .343(ger attrib)-.15 F .343(ute turned on)-.2 F (xpressions in parentheses are e)-.15 F -.25(va)-.25 G .234 (luated \214rst and may).25 F -.15(ove)108 724.8 S (rride the precedence rules abo).15 E -.15(ve)-.15 G(.).15 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(24)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(24)198.725 E 0 Cg EP %%Page: 25 25 %%BeginPageSetup BP @@ -3128,7 +3144,7 @@ qual to, greater than, or greater than or equal to)144 696 R F3(ar)144 -.65 E F3(Ar)6.01 E(g1)-.37 E F0(and)2.5 E F3(ar)2.83 E(g2)-.37 E F0 (may be positi)2.52 E .3 -.15(ve o)-.25 H 2.5(rn).15 G -2.25 -.15(eg a) -2.5 H(ti).15 E .3 -.15(ve i)-.25 H(nte).15 E(gers.)-.15 E(GNU Bash-3.0) -72 768 Q(2004 Jan 28)149.845 E(25)199.835 E 0 Cg EP +72 768 Q(2004 Apr 20)148.735 E(25)198.725 E 0 Cg EP %%Page: 26 26 %%BeginPageSetup BP @@ -3244,7 +3260,7 @@ e remainder of the \214rst line speci\214es an interpreter for the pro-) (COMMAND EXECUTION ENVIR)72 703.2 Q(ONMENT)-.329 E F0(The shell has an) 108 715.2 Q F5 -.2(ex)2.5 G(ecution en).2 E(vir)-.4 E(onment)-.45 E F0 2.5(,w)C(hich consists of the follo)-2.5 E(wing:)-.25 E(GNU Bash-3.0)72 -768 Q(2004 Jan 28)149.845 E(26)199.835 E 0 Cg EP +768 Q(2004 Apr 20)148.735 E(26)198.725 E 0 Cg EP %%Page: 27 27 %%BeginPageSetup BP @@ -3354,8 +3370,8 @@ t for)-.4 F F2 -.2(ex)2.643 G(port).2 E F0 .143(to child pro-)3.323 F .202(parameter assignments, as described abo)108 724.8 R .502 -.15(ve i) -.15 H(n).15 E/F4 9/Times-Bold@0 SF -.666(PA)2.702 G(RAMETERS).666 E/F5 9/Times-Roman@0 SF(.)A F0 .202(These assignment statements af)4.702 F -.203(fect only the)-.25 F(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E -(27)199.835 E 0 Cg EP +.203(fect only the)-.25 F(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E +(27)198.725 E 0 Cg EP %%Page: 28 28 %%BeginPageSetup BP @@ -3440,14 +3456,14 @@ E F1(diso)2.5 E(wn \255h)-.1 E F0(.)A .166(If the)108 484.8 R F1 (huponexit)2.666 E F0 .166(shell option has been set with)2.666 F F1 (shopt)2.666 E F0(,)A F1(bash)2.666 E F0 .166(sends a)2.666 F F4(SIGHUP) 2.666 E F0 .166(to all jobs when an interacti)2.416 F -.15(ve)-.25 G -(login shell e)108 496.8 Q(xits.)-.15 E .076 -(If 0for which a trap has been set, the trap will not be e)108 513.6 R --.15(xe)-.15 G .077(cuted until the command completes.).15 F(When)5.077 -E F1(bash)2.577 E F0(is)2.577 E -.1(wa)108 525.6 S .826 -(iting for an asynchronous command via the).1 F F1(wait)3.326 E F0 -.2 -(bu)3.326 G .826(iltin, the reception of a signal for which a trap has) -.2 F .369(been set will cause the)108 537.6 R F1(wait)2.869 E F0 -.2(bu) -2.869 G .369(iltin to return immediately with an e).2 F .37 +(login shell e)108 496.8 Q(xits.)-.15 E .41 +(If 0 for which a trap has been set, the trap will not be e)108 513.6 R +-.15(xe)-.15 G .41(cuted until the command completes.).15 F(When)5.41 E +F1(bash)2.91 E F0 .3(is w)108 525.6 R .3 +(aiting for an asynchronous command via the)-.1 F F1(wait)2.8 E F0 -.2 +(bu)2.8 G .3(iltin, the reception of a signal for which a trap has).2 F +.369(been set will cause the)108 537.6 R F1(wait)2.869 E F0 -.2(bu)2.869 +G .369(iltin to return immediately with an e).2 F .37 (xit status greater than 128, immediately)-.15 F (after which the trap is e)108 549.6 Q -.15(xe)-.15 G(cuted.).15 E F3 (JOB CONTR)72 566.4 Q(OL)-.329 E F2 -.25(Jo)108 578.4 S 4.568(bc).25 G @@ -3479,7 +3495,7 @@ iated)108 676.8 R .732(with this job is 25647.)108 688.8 R .733 .87(notion of a)108 729.6 R F2(curr)3.37 E .87(ent terminal pr)-.37 F .871(ocess gr)-.45 F .871(oup ID)-.45 F F0 5.871(.M)C .871 (embers of this process group \(processes whose process)-5.871 F -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(28)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(28)198.725 E 0 Cg EP %%Page: 29 29 %%BeginPageSetup BP @@ -3606,7 +3622,7 @@ ized by inserting a number of backslash-escaped special characters that\ (\\r)144 700.8 Q F0(carriage return)28.78 E F4(\\s)144 712.8 Q F0 (the name of the shell, the basename of)29.33 E F4($0)2.5 E F0 (\(the portion follo)2.5 E(wing the \214nal slash\))-.25 E(GNU Bash-3.0) -72 768 Q(2004 Jan 28)149.845 E(29)199.835 E 0 Cg EP +72 768 Q(2004 Apr 20)148.735 E(29)198.725 E 0 Cg EP %%Page: 30 30 %%BeginPageSetup BP @@ -3727,8 +3743,8 @@ nd the k)108 652.8 R 1.334 -.15(ey b)-.1 H 1.034(indings and).15 F -.25 -.15(ey)-.1 G .987(-bindings may be changed with an).15 F F2(inputr) 3.497 E(c)-.37 E F0 3.487(\214le. Other)3.797 F .987 (programs that use this library may)3.487 F(add their o)108 717.6 Q -(wn commands and bindings.)-.25 E(GNU Bash-3.0)72 768 Q(2004 Jan 28) -149.845 E(30)199.835 E 0 Cg EP +(wn commands and bindings.)-.25 E(GNU Bash-3.0)72 768 Q(2004 Apr 20) +148.735 E(30)198.725 E 0 Cg EP %%Page: 31 31 %%BeginPageSetup BP @@ -3810,8 +3826,8 @@ pes is a)108 612 Q -.25(va)-.2 G(ilable:).25 E F2(\\a)144 624 Q F0 648 Q F0(delete)27.66 E F2(\\f)144 660 Q F0(form feed)29.89 E F2(\\n)144 672 Q F0(ne)27.66 E(wline)-.25 E F2(\\r)144 684 Q F0(carriage return) 28.78 E F2(\\t)144 696 Q F0(horizontal tab)29.89 E F2(\\v)144 708 Q F0 --.15(ve)28.22 G(rtical tab).15 E(GNU Bash-3.0)72 768 Q(2004 Jan 28) -149.845 E(31)199.835 E 0 Cg EP +-.15(ve)28.22 G(rtical tab).15 E(GNU Bash-3.0)72 768 Q(2004 Apr 20) +148.735 E(31)198.725 E 0 Cg EP %%Page: 32 32 %%BeginPageSetup BP @@ -3910,7 +3926,7 @@ F0 .448(When set to)144 688.8 R F1(On)2.948 E F0 2.948(,m)C(ak)-2.948 E .449(crolling the input horizontally on a)-2.948 F 1.194(single screen \ line when it becomes longer than the screen width rather than wrapping \ to a ne)144 700.8 R(w)-.25 E(line.)144 712.8 Q(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(32)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(32)198.725 E 0 Cg EP %%Page: 33 33 %%BeginPageSetup BP @@ -4009,7 +4025,7 @@ F0 .463(construct allo)2.963 F .462(ws bindings to be made based on the\ (xt of the test e)-.15 F .477 (xtends to the end of the line; no characters)-.15 F (are required to isolate it.)144 705.6 Q(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(33)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(33)198.725 E 0 Cg EP %%Page: 34 34 %%BeginPageSetup BP @@ -4117,8 +4133,8 @@ E F0 .911(refers to the current cursor position, and)3.411 F F2(mark) (db).15 G 3.41(yt)-3.41 G(he)-3.41 E F1(set\255mark)108 724.8 Q F0 2.5 (command. The)2.5 F(te)2.5 E (xt between the point and mark is referred to as the)-.15 E F2 -.37(re) -2.5 G(gion)-.03 E F0(.)A(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(34) -199.835 E 0 Cg EP +2.5 G(gion)-.03 E F0(.)A(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(34) +198.725 E 0 Cg EP %%Page: 35 35 %%BeginPageSetup BP @@ -4197,8 +4213,8 @@ etween the start of the current)-.1 F(line and the point.)144 688.8 Q (th an ar).4 F(gument)-.18 E/F3 10/Times-Italic@0 SF(n)3.294 E F0 3.294 (,i).24 G .794(nsert the)-3.294 F F3(n)3.294 E F0 .794(th w)B .794 (ord from the pre)-.1 F .794(vious command \(the w)-.25 F .795 -(ords in the)-.1 F(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(35) -199.835 E 0 Cg EP +(ords in the)-.1 F(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(35) +198.725 E 0 Cg EP %%Page: 36 36 %%BeginPageSetup BP @@ -4294,8 +4310,8 @@ G .779(nsert characters lik)-3.279 F(e)-.1 E F2(C\255q)3.278 E F0 3.278 -.1 F .023(ving point o)-.15 F -.15(ve)-.15 G 2.524(rt).15 G .024(hat w) -2.524 F .024(ord as well.)-.1 F .024(If point)5.024 F (is at the end of the line, this transposes the last tw)144 700.8 Q 2.5 -(ow)-.1 G(ords on the line.)-2.6 E(GNU Bash-3.0)72 768 Q(2004 Jan 28) -149.845 E(36)199.835 E 0 Cg EP +(ow)-.1 G(ords on the line.)-2.6 E(GNU Bash-3.0)72 768 Q(2004 Apr 20) +148.735 E(36)198.725 E 0 Cg EP %%Page: 37 37 %%BeginPageSetup BP @@ -4384,7 +4400,7 @@ F0 -1(Ya)144 676.8 S(nk the top of the kill ring into the b)1 E(uf)-.2 E (Rotate the kill ring, and yank the ne)144 700.8 Q 2.5(wt)-.25 G 2.5 (op. Only)-2.5 F -.1(wo)2.5 G(rks follo).1 E(wing)-.25 E F1(yank)2.5 E F0(or)2.5 E F1(yank\255pop)2.5 E F0(.)A(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(37)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(37)198.725 E 0 Cg EP %%Page: 38 38 %%BeginPageSetup BP @@ -4486,7 +4502,7 @@ F0(List the possible completions of the te)144 628.8 Q .715(ords, shell functions, shell b)-.1 F .715(uiltins, and)-.2 F (\214nally e)144 724.8 Q -.15(xe)-.15 G (cutable \214lenames, in that order).15 E(.)-.55 E(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(38)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(38)198.725 E 0 Cg EP %%Page: 39 39 %%BeginPageSetup BP @@ -4582,8 +4598,8 @@ F0 1.095(command enough times to)3.595 F (he current line a shell comment.)-3.339 F .839(If a numeric ar)5.839 F (gu-)-.18 E(ment causes the comment character to be remo)144 729.6 Q -.15(ve)-.15 G(d, the line will be e).15 E -.15(xe)-.15 G -(cuted by the shell.).15 E(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E -(39)199.835 E 0 Cg EP +(cuted by the shell.).15 E(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E +(39)198.725 E 0 Cg EP %%Page: 40 40 %%BeginPageSetup BP @@ -4703,7 +4719,7 @@ F .404(gument is the name of the command whose ar)-.18 F .403 (guments are being completed, the second)-.18 F(ar)108 729.6 Q 1.993 (gument is the w)-.18 F 1.993(ord being completed, and the third ar)-.1 F 1.993(gument is the w)-.18 F 1.993(ord preceding the w)-.1 F 1.994 -(ord being)-.1 F(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(40)199.835 +(ord being)-.1 F(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(40)198.725 E 0 Cg EP %%Page: 41 41 %%BeginPageSetup @@ -4849,7 +4865,7 @@ R 1.485(ws control o)-.25 F -.15(ve)-.15 G 3.986(rw).15 G 1.486 E(OL)-.27 E F0(and)3.736 E F2(HISTIGNORE)108 729.6 Q F0 -.25(va)2.708 G .458(riables may be set to cause the shell to sa).25 F .757 -.15(ve o) -.2 H .457(nly a subset of the commands entered.).15 F(The)5.457 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(41)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(41)198.725 E 0 Cg EP %%Page: 42 42 %%BeginPageSetup BP @@ -4972,7 +4988,7 @@ SF(^)108 667.4 Q F4(string1)-5 I F5(^)5 I F4(string2)-5 I F5(^)5 I F0 F4(string2)A F0(/')A 2.5('\()-.74 G(see)-2.5 E F1(Modi\214ers)2.5 E F0 (belo)2.5 E(w\).)-.25 E F1(!#)108 698.4 Q F0 (The entire command line typed so f)27.67 E(ar)-.1 E(.)-.55 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(42)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(42)198.725 E 0 Cg EP %%Page: 43 43 %%BeginPageSetup BP @@ -5088,7 +5104,7 @@ R -.15(xe)-.15 G 3.332(cutable. When).15 F F1(bash)3.332 E F0 .832 /Times-Roman@0 SF(.)A F0 .981(If the)5.481 F F1(sour)3.481 E(cepath)-.18 E F0 .981(option to the)3.481 F F1(shopt)3.481 E F0 -.2(bu)3.481 G .981 (iltin command is turned of).2 F .981(f, the)-.25 F(GNU Bash-3.0)72 768 -Q(2004 Jan 28)149.845 E(43)199.835 E 0 Cg EP +Q(2004 Apr 20)148.735 E(43)198.725 E 0 Cg EP %%Page: 44 44 %%BeginPageSetup BP @@ -5200,7 +5216,7 @@ F2 -.1(ke)2.5 G(yseq)-.2 E F0(Remo)180 650.4 Q .3 -.15(ve a)-.15 H .3 F2 -.1(ke)2.5 G(yseq)-.2 E F0(is entered.)2.5 E(The return v)144 691.2 Q (alue is 0 unless an unrecognized option is gi)-.25 E -.15(ve)-.25 G 2.5 (no).15 G 2.5(ra)-2.5 G 2.5(ne)-2.5 G(rror occurred.)-2.5 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(44)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(44)198.725 E 0 Cg EP %%Page: 45 45 %%BeginPageSetup BP @@ -5336,8 +5352,8 @@ F2(action)2.786 E F0 2.786(][)C F1-2.786 E F2(globpat)2.786 E F0 E F2(suf-)2.786 E<8c78>108 712.8 Q F0(])A([)144 724.8 Q F1A F2 (\214lterpat)2.5 E F0 2.5(][)C F1-2.5 E F2(function)2.5 E F0 2.5 (][)C F1-2.5 E F2(command)2.5 E F0(])A F2(name)2.5 E F0([)2.5 E F2 -(name ...)A F0(])A(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(45) -199.835 E 0 Cg EP +(name ...)A F0(])A(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(45) +198.725 E 0 Cg EP %%Page: 46 46 %%BeginPageSetup BP @@ -5412,7 +5428,7 @@ Q(en from the \214le speci\214ed by the)-.1 E/F3 9/Times-Bold@0 SF (HOSTFILE)2.5 E F0(shell v)2.25 E(ariable.)-.25 E F1(job)184 696 Q F0 (Job names, if job control is acti)26.11 E -.15(ve)-.25 G 5(.M).15 G (ay also be speci\214ed as)-5 E F12.5 E F0(.)A(GNU Bash-3.0)72 768 -Q(2004 Jan 28)149.845 E(46)199.835 E 0 Cg EP +Q(2004 Apr 20)148.735 E(46)198.725 E 0 Cg EP %%Page: 47 47 %%BeginPageSetup BP @@ -5519,7 +5535,7 @@ n is de\214ned are displayed as well.)144 662.4 R(The)6.309 E F1 698.4 Q F0(Each)25.3 E F2(name)2.5 E F0(is an array v)2.5 E (ariable \(see)-.25 E F1(Arrays)2.5 E F0(abo)2.5 E -.15(ve)-.15 G(\).) .15 E F1144 710.4 Q F0(Use function names only)26.97 E(.)-.65 E -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(47)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(47)198.725 E 0 Cg EP %%Page: 48 48 %%BeginPageSetup BP @@ -5639,7 +5655,7 @@ F .659(by def)144 648 R(ault.)-.1 E F1(echo)5.659 E F0 .659 (\\a)144 672 Q F0(alert \(bell\))28.22 E F1(\\b)144 684 Q F0(backspace) 27.66 E F1(\\c)144 696 Q F0(suppress trailing ne)28.78 E(wline)-.25 E F1 (\\e)144 708 Q F0(an escape character)28.78 E(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(48)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(48)198.725 E 0 Cg EP %%Page: 49 49 %%BeginPageSetup BP @@ -5773,8 +5789,8 @@ Q F0(that is not a function.)2.68 E F1(fc)108 688.8 Q F0([)2.5 E F1 (is selected from the his-)3.658 F .882(tory list.)144 724.8 R F2 -.45 (Fi)5.882 G -.1(rs).45 G(t).1 E F0(and)4.062 E F2(last)3.472 E F0 .882 (may be speci\214ed as a string \(to locate the last command be)4.062 F -.881(ginning with)-.15 F(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(49) -199.835 E 0 Cg EP +.881(ginning with)-.15 F(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(49) +198.725 E 0 Cg EP %%Page: 50 50 %%BeginPageSetup BP @@ -5904,7 +5920,7 @@ F0 .399(is silent, the option character found is placed in)2.899 F F4 729.6 R 1.241(gument is not found, and)-.18 F F3(getopts)3.741 E F0 1.241(is not silent, a question mark \()3.741 F F3(?).833 E F0 3.742 (\)i).833 G 3.742(sp)-3.742 G 1.242(laced in)-3.742 F(GNU Bash-3.0)72 -768 Q(2004 Jan 28)149.845 E(50)199.835 E 0 Cg EP +768 Q(2004 Apr 20)148.735 E(50)198.725 E 0 Cg EP %%Page: 51 51 %%BeginPageSetup BP @@ -6019,7 +6035,7 @@ E F0 .28 (is supplied as an ar)2.922 F .421(gument to)-.18 F F32.921 E F0 (,)A(or the history e)144 703.2 Q(xpansion supplied as an ar)-.15 E (gument to)-.18 E F32.5 E F0 -.1(fa)2.5 G(ils.).1 E(GNU Bash-3.0) -72 768 Q(2004 Jan 28)149.845 E(51)199.835 E 0 Cg EP +72 768 Q(2004 Apr 20)148.735 E(51)198.725 E 0 Cg EP %%Page: 52 52 %%BeginPageSetup BP @@ -6146,7 +6162,7 @@ tring which contains three types of objects: plain characters, which ar\ e simply)144 715.2 R 1.859 (copied to standard output, character escape sequences, which are con) 144 727.2 R -.15(ve)-.4 G 1.858(rted and copied to the).15 F -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(52)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(52)198.725 E 0 Cg EP %%Page: 53 53 %%BeginPageSetup BP @@ -6264,8 +6280,8 @@ F2144 655.2 Q F0 .373 -.15 E(s)-.1 E F2 -.18(re)180 691.2 S(ad).18 E F0 1.394 (returns after reading)3.894 F F1(nc)3.894 E(har)-.15 E(s)-.1 E F0 1.395 (characters rather than w)3.894 F 1.395(aiting for a complete line of) --.1 F(input.)180 703.2 Q(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(53) -199.835 E 0 Cg EP +-.1 F(input.)180 703.2 Q(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(53) +198.725 E 0 Cg EP %%Page: 54 54 %%BeginPageSetup BP @@ -6389,7 +6405,7 @@ SF3.481 E F3 .98(list, or if the command's r)3.481 F .98 .711(This option is on by default for interac-)5.711 F 1.165 (tive shells on systems that support it \(see)184 727.2 R F5 1.164 (JOB CONTROL)3.664 F F3 3.664(above\). Backgr)3.414 F(ound)-.18 E F0 -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(54)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(54)198.725 E 0 Cg EP %%Page: 55 55 %%BeginPageSetup BP @@ -6451,7 +6467,7 @@ F24.631 E F1 2.131(is supplied with no)4.631 F F3(option\255name) (ent options ar)-.18 F(e)-.18 E 4.411(printed. If)184 726 R F2(+o)4.411 E F1 1.911(is supplied with no)4.411 F F3(option\255name)4.412 E F1 4.412(,as)C 1.912(eries of)-4.412 F F2(set)4.412 E F1 1.912(commands to) -4.412 F F0(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(55)199.835 E 0 Cg +4.412 F F0(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(55)198.725 E 0 Cg EP %%Page: 56 56 %%BeginPageSetup @@ -6573,8 +6589,8 @@ G(f)-2.5 E F3(n)2.76 E F1(is gr)2.58 E(eater than)-.18 E F2($#)2.5 E F1 (olling optional shell behavior)-.18 F 6.523(.W)-.74 G 1.523 (ith no options, or)-7.073 F 2.532(with the)144 722.4 R F25.032 E F1 2.531(option, a list of all settable options is displayed, with an i\ -ndication of)5.032 F F0(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(56) -199.835 E 0 Cg EP +ndication of)5.032 F F0(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(56) +198.725 E 0 Cg EP %%Page: 57 57 %%BeginPageSetup BP @@ -6668,7 +6684,7 @@ F1 1.106(trap r)3.606 F 1.107(eturns a value of 2, and the)-.18 F .871 (outine \(a shell function or a shell script exe-)-.18 F(cuted by the) 220 728.4 Q F2(.)2.5 E F1(or)2.5 E F2(source)2.5 E F1 (builtins\), a call to)2.5 E F2(return)2.5 E F1(is simulated.)2.5 E F0 -(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(57)199.835 E 0 Cg EP +(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(57)198.725 E 0 Cg EP %%Page: 58 58 %%BeginPageSetup BP @@ -6748,8 +6764,8 @@ F3(mail\214le)4.147 E F2 1.647(has been r)4.147 F(ead')-.18 E 4.147('i) F2 1.548 (matches \214lenames in a case\255insensitive fashion when performing) 4.048 F(pathname expansion \(see)184 696 Q F1(Pathname Expansion)2.5 E -F2(above\).)2.5 E F0(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(58) -199.835 E 0 Cg EP +F2(above\).)2.5 E F0(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(58) +198.725 E 0 Cg EP %%Page: 59 59 %%BeginPageSetup BP @@ -6835,7 +6851,7 @@ F2 1.401(the expr)3.651 F 1.401(ession is tr)-.18 F 1.401 1.356(the \214rst ar)3.856 F 1.356 (gument is not a valid unary conditional operator)-.18 F 3.855(,t)-.74 G (he)-3.855 E(expr)180 712.8 Q(ession is false.)-.18 E F0(GNU Bash-3.0)72 -768 Q(2004 Jan 28)149.845 E(59)199.835 E 0 Cg EP +768 Q(2004 Apr 20)148.735 E(59)198.725 E 0 Cg EP %%Page: 60 60 %%BeginPageSetup BP @@ -6976,7 +6992,7 @@ E F1 2.515(,e)C .015(ven if)-2.515 F F7 .015(type -t)2.515 F(name)144 .411(option is used,)2.911 F F4(type)2.91 E F1 .41(prints all)2.91 F .164(of the places that contain an executable named)144 722.4 R F5(name) 2.664 E F1 5.164(.T).35 G .164(his includes aliases and functions,) --5.164 F F0(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(60)199.835 E 0 +-5.164 F F0(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(60)198.725 E 0 Cg EP %%Page: 61 61 %%BeginPageSetup @@ -7098,7 +7114,7 @@ E F5(,)A F4(HISTCMD)3.724 E F5(,)A F4(FUNCNAME)144 708 Q F5(,)A F4 .553(operties, even if)-.18 F(they ar)144 720 Q 2.5(es)-.18 G (ubsequently r)-2.5 E 2.5(eset. The)-.18 F(exit status is tr)2.5 E (ue unless a)-.08 E F3(name)2.76 E F1(is r)2.85 E(eadonly)-.18 E(.)-1.11 -E F0(GNU Bash-3.0)72 768 Q(2004 Jan 28)149.845 E(61)199.835 E 0 Cg EP +E F0(GNU Bash-3.0)72 768 Q(2004 Apr 20)148.735 E(61)198.725 E 0 Cg EP %%Page: 62 62 %%BeginPageSetup BP @@ -7182,7 +7198,7 @@ F2 2.5(,B)C(rian Fox and Chet Ramey)-2.5 E F3(Portable Operating System\ (The personal initialization \214le, executed for login shells)144 686.4 Q F3(~/.bashr)109.666 698.4 Q(c)-.18 E F2(The individual per)144 710.4 Q (-interactive-shell startup \214le)-.18 E F0(GNU Bash-3.0)72 768 Q -(2004 Jan 28)149.845 E(62)199.835 E 0 Cg EP +(2004 Apr 20)148.735 E(62)198.725 E 0 Cg EP %%Page: 63 63 %%BeginPageSetup BP @@ -7249,7 +7265,7 @@ F1(bashbug)108.13 393.6 Q F2 1.316(inserts the \214rst thr)4.296 F 1.316 -.18 F .431(or messages while the con-)-.18 F(str)108 631.2 Q (uct is being r)-.08 E(ead.)-.18 E (Array variables may not \(yet\) be exported.)108 648 Q F0(GNU Bash-3.0) -72 768 Q(2004 Jan 28)149.845 E(63)199.835 E 0 Cg EP +72 768 Q(2004 Apr 20)148.735 E(63)198.725 E 0 Cg EP %%Trailer end %%EOF diff --git a/doc/bashref.dvi b/doc/bashref.dvi index 081341a93576dd9d15124295d5bfa8179bbb33f8..32fbaac368b09cbd322c5f979eab5e67f8f982c1 100644 GIT binary patch delta 2859 zc-mD~3vd(18Rp;HJ6WeY$>wS5;9yg50OL29hZ8U@1Tr?1Kmwk?z*#!m0$DQB8AD8Q z36zqQmvW6x1w!qFVldDe3)m2#rGUXSZAu21cmSz1-~=co1PEag9^KQ)iK3Ys-G1Ny z*!}l^+`7Gk&hH(xDa~Avm6tO%cVyluHQYFK-%JJ)8Y=!QwY$}sAc z9L@|@c)S~$*86)Vy%^DnaAttnQ4xBB@v~qK^)}xb0i7YXa9j?Y2^CjP&IUHLHn5V1 z5^Y8X^a>4V>axPeA*Qtp!D$0})OLo4y`fV_%MiS!LxrK)$6gn$*Vg~xZjT=8qprfE z)Wp_oZ9+RXh5CFvMudPNxaQJMGc}Rjbzel+?itwJdwvVt2;F}2od9h*G>!}wKo;Ro z4>tksJ!5%QIlPAwd@X(>T!_Dqr69kzm7>@vq1^zoCQ+_&%1k*+M583O6 ziz2uT@WgV+wpm|{KWd(qwuH$gx$E@3Mh`HSD40%)O3?%x94Eh=izFKq#WBe)ly8A; zq@)g&+Q1UWoLhqi2vA18dK-PmL+kfU8X3F|EfQf5@$W{hJp3Y#dHo>z+5$joj-$7% zkR8Y5e}eJ^_>feDQKkTc2%c{2S>@D!GHpR8K{$Q_%7Xpd%mos$`c-t(FzZsI_j39!KYp`_YQ%K)(hlH~2X$0O zJHq23lT_OF3@5TL(~p<@zPy%hLahsWybe{Vk`$FT38#a$0>x>UT&m)syNX$hss)$> z54E8dJj|vlPP$7!E4)3ciYjS~EO<~ucS}uo`TVq>j+mTI8!LWw26ejy=chZ}K1Fid z`J<~og5Qz z0T0`a9DS}IUSmc5SkgKeTLd^3MVr6O#b)>ixic0|7SXsKhUlUxG{!K61ZHF2MvJJa z0_P@L_r+JiXrl^x*I_ee@a%2cz51v)JEm9Zc4a7G97wSik$mTY&hJP)gz|LkT(`uXt# zalM{BD?kT1w3f~937ks&-^NDFP)%G%*lQS8lNo&kjhJ?D$Er$k6eW>@B$KTKB@NIf&7;gbLYWn*^vpw- zo9t+LG1;)(R4|nm^NDuT*70zOEMOC+7Q#}}Qk3v{fBOC5e>Gue3G5CE4H OKH(;qFQb1OzyAXv`Xj6W delta 2674 zc-m!^4^R}>8Nl zZDMpfX;g5>TNJfAsrUztkqbVX#1>OyOeeLd2|6ffW=b{26b%^dXiVSkLNL>txtrVH z_y61Peea9INpBxcs!p_~xze+9(k4tuRnP7obM!?9#1)$#%$EGsjfoXfaCPJr@WX;^ zwV$Zzsi~P`T$>I!Gcq>T42b?kL5VjM#*p9*snb1P#T)Re8LrgiIz0GupA=Hmit_3? z9Ue)MJ!<;T91Uj1TELPog-TR4IxA*Kd-A3|hR32nFwE2!b?Bn@WHl0EYFMyGSnKT+ zxE}d_Vs0v2ili6M7!Ly@tHZDJuvm?5j)~a!blRak(sQH}L90Q&ZTyUfk0Rv6A_Uta z(alFid-ujae)q%^8;v;a6IFO`yt=g88i_iaCBj~6loNUN@?I;9ij3^+5m6^H(7f(V z0^E;Wee}QvC$&50A&11;ph$!hq$&Bo0 zNd98kRfn6uo2LdsMw298m@1S@L8(kuR`}i3z4{(kZ2`5n1!)sypIj#E zog<5KA%RC3f*CO~9h?qWN=_BPEE_bKaHa(FM7T?~`JqjO-DY2BQdttF3T}lwN@=0?ap+*4=<2D~u;M z??9AYORHmtXw}mpsVN0@*`SRK7m?;bA~s{+jz`!5JIUQ~=-DW^qOBOjWD{Q|`iB6+ zNX}IBz6}yhIC>7sb3iNcEZgwa0 znG_MO_wfYcUdIG%w5SW4nMEReU52;}hZ4enCc)u6dno{Fv#q zfzmIi|0h$oF8&hJ3NBx4x4TiS1m>lV5#_$j}5~YG`JTzQoCCqenmPy+i6SZAD z9?f7hT|2|$5gzIjO|SGSC5ExQ$}N}cXQt1xL{h>yu2T7VEW^=i)gMq)cYwx`ync0Q z$20AtT{T>m{4QI?VJOmsgcjGb3}mtA;&u zepZpuA)lmm&4*acW5YvpdadGS$6Z-zY)JP4^6~>P8|p@f&u2`VMHb%F6U) zDr>c`S|CPqL}MPKpNO^>#Gq z4EgpcEZAV3F)_|`9IuadN-mxuqMX0=s~?z&$2dSB7ZzgP0bWD;<_?$56GHMj0 zlS02CB~V_zop#%!E)OgV(YJPSgLZojjkXdX%IV++z#XXfiRO~G~hHFI(X8gI|x1~qGLT|<|lZa1D$F$G4my+TWc}t zx`urMtTo}5Ti7k2Z*G!%_i&5|>vft%@>#ZxhizoIlcig$flzpiMX_BZE}mV(!9G*# z^HJ=cC`cmyacqNt#y&LZ{4CZfzyadUXJ6w{-W`(;ox@(X!3y&IBK89w-XupoY(5WD z_VxH#5#G?~V>U^tVq54)kVn5~GX}uhCR|>}7K&(lGx=;k+hT=qxNoc^%hHbC^JThN?I-Ol(zmy z)&nty@(;7Q_@?39B0H=im3B@Of&Gb-{CJMu-aARxXl}d>*7ghLXL1(>I84S)cpIG!li*}=cKCjfA_1rM6I?QF0-3z$g4rjsT$8VanbnWDQ zE?sL2b562F=KK!iX?e_MK?V1|6RHWnfm`l`T0=spWT*oetzj>XFo{t1&u}EXMsebPFr?NfiT(2M$O8C4AM0@ j>fdp&mbAVUwf}kWkl(%&C8dE#zWO5SCU6?MN - +